首页 > 解决方案 > Elasticsearch NEST 提升现有查询

问题描述

我们有一个复杂的系统来生成我们的弹性查询。我们有类似的对象QueryBuilder可以帮助我们根据需要动态构建弹性查询。所以我们的过滤是使用这样的结构构建的:AllFilters &= Query<TModel>.Must(requirement);

然后,当我们构建查询时,我们会这样做,sda在哪里SearchDescriptor<TModel>

        var fullQuery = Query<TModel>.Bool(b => b
            .Must(m => m
                .Bool(b2 => b2
                    .Must(Filter, OrFilter)
            )));

        sd = sd.Query(_ => fullQuery);

我的问题是,我如何正确地为这个查询添加提升?

我有一个类似的构造List<QueryContainer> AllBoosts,我像这样枚举:

    protected IEnumerable<QueryContainer> GetBoosts()
    {
        if (Boosts.OrEmptyIfNull().Any())
        {
            foreach(var boost in Boosts)
            {
                yield return Query<TModel>.Boosting(b => b.Boost(2).Positive(p => boost));
            }
        }
    }

然后尝试将&=其放入 中SearchDescriptor,但这不会返回任何结果:

        var fullQuery = Query<TModel>.Bool(b => b
            .Must(m => m
                .Bool(b2 => b2
                    .Must(Filter, OrFilter) //these are filters we've built up with conditions in the code
            )));

        //here i enumerate boosts defined in the class
        foreach (var boost in GetBoosts())
            fullQuery &= boost; //should this be &=, |=, or something else?

        sd = sd.Query(_ => fullQuery);

输出查询:

{
  "from": 0,
  "size": 50,
  "sort": [
    {
      "name": {
        "order": "asc"
      }
    }
  ],
  "query": {
    "bool": {
      "must": [
        {
          //various must clauses from class properties / settings here
        },
        {
          "boosting": {
            "boost": 2.0,
            "positive": {
              "nested": {
                "query": {
                  "terms": {
                    "companies.id": [
                      "500086674"
                    ]
                  }
                },
                "path": "companies"
              }
            }
          }
        }
      ]
    }
  }
}

在不更改过滤器的原始构建的情况下将提升组合到我的查询中的正确方法是什么?弹性版本 5.4

标签: c#elasticsearchnest

解决方案


推荐阅读