【问题标题】:Building a dynamic query using object initializer syntax使用对象初始值设定项语法构建动态查询
【发布时间】:2018-11-06 05:21:44
【问题描述】:

我正在使用 Nest 来查询 Elasticsearch,我已经为我的搜索编写了这个查询:

var searchResponse = _elasticClient.Search<AdDocument>(s => s
    .Query(q => q
       .Bool(b => b
          .Must(m => m
             .MultiMatch(mm => mm
                .Fields(f => f.Field(p => p.Title, 1.5).Field(p => p.Description))
                .Query("MyKeyword")
                .Fuzziness(Fuzziness.Auto)
             )
       )
       .Filter(fi => fi
          .Bool(fb => fb
             .Must(m => m.Range(r => r.Field(f => f.NoOfBedrooms == 3)),
                   m => m.Range(r => r.Field(f => f.NoOfBathrooms == 2)),
                   m => m.Range(r => r.Field(f => f.Price > 2000))
             )
          )
       )
    )
  )
);

我想要实现的是动态构建此查询,具体取决于传入的过滤器。如何使用 Object Initializer 编写此查询?

例如,我想在查询之外创建这三个范围过滤器并将它们放在 3 个对象中,例如 rangeFilter1rangeFilter2rangeFilter3,然后在查询内部使用逻辑与 (&&) 将它们组合起来.

【问题讨论】:

    标签: elasticsearch nest elasticsearch-net


    【解决方案1】:

    这是对象初始化语法:

    var boolQuery = new BoolQuery
    {
      Must = new QueryContainer[]
      {
        new MultiMatchQuery
        {
          Fields = Field<AdDocument>(p => p.Title, 1.5).And<AdDocument>(p => p.Description),
          Query = "MyKeyword",
          Fuzziness = Fuzziness.Auto
        }
      },
      Filter = new QueryContainer[]
      {
        new TermQuery { Field = Field<AdDocument>(f => f.NoOfBedrooms), Value = 3 } &&
        new TermQuery { Field = Field<AdDocument>(f => f.NoOfBathrooms), Value = 2 } &&
        new NumericRangeQuery { Field = Field<AdDocument>(p => p.Price), GreaterThan = 2000 }
      }
    };
    
    var searchResponse = _elasticClient.Search<AdDocument>(new SearchRequest<AdDocument>
    {
      Query = boolQuery
    });
    

    这将产生以下 JSON DSL:

    {
      "query": {
        "bool": {
          "must": [
            {
              "multi_match": {
                "query": "MyKeyword",
                "fuzziness": "AUTO",
                "fields": [
                  "title^1.5",
                  "description"
                ]
              }
            }
          ],
          "filter": [
            {
              "bool": {
                "must": [
                  {
                    "term": {
                      "noOfBedrooms": {
                        "value": 3
                      }
                    }
                  },
                  {
                    "term": {
                      "noOfBathrooms": {
                        "value": 2
                      }
                    }
                  },
                  {
                    "range": {
                      "price": {
                        "gt": 2000.0
                      }
                    }
                  }
                ]
              }
            }
          ]
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2022-10-04
      • 2018-07-08
      • 2011-09-30
      • 1970-01-01
      • 2020-09-21
      • 1970-01-01
      • 2011-04-08
      • 2019-10-28
      • 1970-01-01
      相关资源
      最近更新 更多