Hus*_*man 3 nested dynamic elasticsearch booleanquery nest
我必须使用Nest查询嵌套对象,但查询是以动态方式构建的.下面的代码演示了以静态方式对嵌套"书籍"使用查询
QueryContainer qry;
qry = new QueryStringQuery()
{
DefaultField = "name",
DefaultOperator = Operator.And,
Query = "salman"
};
QueryContainer qry1 = null;
qry1 = new RangeQuery() // used to search for range ( from , to)
{
Field = "modified",
GreaterThanOrEqualTo = Convert.ToDateTime("21/12/2015").ToString("dd/MM/yyyy"),
};
QueryContainer all = qry && qry1;
var results = elastic.Search<Document>(s => s
.Query(q => q
.Bool(qb => qb
.Must(all)))
.Filter(f =>
f.Nested(n => n
.Path("books")
.Filter(f3 => f3.And(
f1 => f1.Term("book.isbn", "122"),
f2 => f2.Term("book.author", "X"))
)
)
)
);
Run Code Online (Sandbox Code Playgroud)
问题是我需要以动态方式将多个查询(使用And,OR运算符)组合成"书籍".例如,获取满足以下条件的书籍:
现在,嵌套查询中的过滤器应检索以下项目中的书籍:
条件1 和条件2 或条件3
假设我有类名FilterOptions,它包含以下属性:
我将循环使用给定的FilterOptions数组来构建查询.
题:
我应该用什么来构建嵌套查询?它是一个FilterDesciptor,如何组合它们将嵌套查询添加到搜索方法?
请推荐任何有价值的链接或示例?
小智 12
我同意paweloque,看来你的前两个条件是矛盾的,如果和它们在一起就行不通.忽略这一点,这是我的解决方案.我已经实现了这种方式,允许超过你拥有的三个特定条件.我也觉得它在bool声明中更适合.
QueryContainer andQuery = null;
QueryContainer orQuery = null;
foreach(var authorFilter in FilterOptions.Where(f=>f.Operator==Operator.And))
{
andQuery &= new TermQuery
{
Field = authorFilter.FieldName,
Value = authorFilter.Value
};
}
foreach(var authorFilter in FilterOptions.Where(f=>f.Operator==Operator.Or))
{
orQuery |= new TermQuery
{
Field = authorFilter.FieldName,
Value = authorFilter.Value
};
}
Run Code Online (Sandbox Code Playgroud)
在那之后,.Nested我会在电话中说:
.Path("books")
.Query(q=>q
.Bool(bq=>bq
.Must(m=>m.MatchAll() && andQuery)
.Should(orQuery)
))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3908 次 |
| 最近记录: |