弹性搜索5.x嵌套多个查询C#

时间:2017-03-04 21:59:35

标签: c# elasticsearch nest

我正在使用C#和那些nuget packeges;

  <package id="Elasticsearch.Net" version="5.2.0" targetFramework="net462" />
  <package id="NEST" version="5.2.0" targetFramework="net462" />
  <package id="Newtonsoft.Json" version="9.0.1" targetFramework="net462" />

我想在这里做什么,我希望在价格范围2000 - 3000中获得“白色”商品。这是一个简单的搜索API请求,我是对的吗?

所以我为此编写了一个代码。这里是;

private static void Search(IElasticContext elasticContext, string indexName)
    {
        IQueryContainer termQueryContainer = new QueryContainer();
        termQueryContainer.Term = new TermQuery
                                  {
                                      Field = new Field("description"),
                                      Value = "white"
                                  };

        IQueryContainer rangeQueryContainer = new QueryContainer();
        rangeQueryContainer.Range = new NumericRangeQuery
                                    {
                                        Field = new Field("price"),
                                        LessThanOrEqualTo = 3000,
                                        GreaterThanOrEqualTo = 2000
                                    };

        //Should get 2 items.

        SearchRequest<Product> searchRequest = new SearchRequest<Product>(indexName, typeof(Product))
                                               {
                                                   Size = 10,
                                                   From = 0,
                                                   Query = (QueryContainer) rangeQueryContainer,
                                                   PostFilter = (QueryContainer) termQueryContainer
                                               };

        EsSearchResponse<Product> response = elasticContext.Search<Product>(searchRequest);

        Console.WriteLine(response.StatusMessage);

        if (response.IsValid)
        {
            foreach (Product product in response.Documents)
            {
                Console.WriteLine("Id: {0} | Name: {1}", product.Id, product.Name);
            }
        }
    }

但它不起作用,因为请求已经成功,但结果中没有文档,但我有。我可以使用Sense插件查看文档。

如果我组合两个查询,nest将在运行时抛出异常(说:“QueryContainer只能容纳一个查询已包含一个TermQuery”)。这里是;

Nest throws exception

另外,我不能使用流畅的api,因为我将参数传递给类似于知识库的函数;

    EsSearchResponse<Product> response = elasticContext.Search<Product>(searchRequest);

如何在Nest dll的SearchRequest中组合两个简单查询(在描述字段中搜索和在2000-3000之间的价格范围)。我做错了什么?

1 个答案:

答案 0 :(得分:5)

您尝试做的是从两个查询形成复合查询,其中两个查询必须由文档满足才能被视为匹配。 A bool query is used to combine queries in this manner,必须使用must子句指定两个查询。这是一个使用对象初始化语法

的示例
var client = new ElasticClient();
var indexName = "index-name";
var mustClauses = new List<QueryContainer>();

mustClauses.Add(new TermQuery
{
    Field = new Field("description"),
    Value = "white"
});

mustClauses.Add(new NumericRangeQuery
{
    Field = new Field("price"),
    LessThanOrEqualTo = 3000,
    GreaterThanOrEqualTo = 2000
});

var searchRequest = new SearchRequest<Product>(indexName)
{
    Size = 10,
    From = 0,
    Query = new BoolQuery { Must = mustClauses }
};

var searchResponse = client.Search<Product>(searchRequest);

使用range查询,文档是否与查询子句匹配,因此我们可以通过将其添加为bool查询{{1}来放弃为查询计算的分数子句

filter
相关问题