我必须使用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(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")) ) ) ) );
问题是我需要以动态方式将多个查询(使用And,OR运算符)组合成"书籍".例如,获取满足以下条件的书籍:
条件1:具有作者"X"和isbn"1"的书籍
条件2:具有作者"X"和isbn"2"的书籍
条件3:具有作者"Z"和isbn"3"的书籍
其他条件:.....
现在,嵌套查询中的过滤器应检索以下项目中的书籍:
条件1 和条件2 或条件3
假设我有类名FilterOptions,它包含以下属性:
字段名
值
运算符(将结合下一个过滤器)
我将循环使用给定的FilterOptions数组来构建查询.
题:
我应该用什么来构建嵌套查询?它是一个FilterDesciptor,如何组合它们将嵌套查询添加到搜索方法?
请推荐任何有价值的链接或示例?
我同意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 }; }
在那之后,.Nested
我会在电话中说:
.Path("books") .Query(q=>q .Bool(bq=>bq .Must(m=>m.MatchAll() && andQuery) .Should(orQuery) ))