当前位置:  开发笔记 > 数据库 > 正文

Nest Elastic - 构建动态嵌套查询

如何解决《NestElastic-构建动态嵌套查询》经验,为你挑选了1个好方法。

我必须使用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,如何组合它们将嵌套查询添加到搜索方法?

请推荐任何有价值的链接或示例?



1> 小智..:

我同意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)
    ))

推荐阅读
李桂平2402851397
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有