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

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

   

我想在这里做什么, 我想在价格范围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 searchRequest = new SearchRequest(indexName, typeof(Product)) { Size = 10, From = 0, Query = (QueryContainer) rangeQueryContainer, PostFilter = (QueryContainer) termQueryContainer }; EsSearchResponse response = elasticContext.Search(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将在运行时抛出exception(说:“QueryContainer只能容纳一个查询已经包含一个TermQuery”)。 这里是;

Nest抛出异常

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

  EsSearchResponse response = elasticContext.Search(searchRequest); 

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

您要做的是从两个查询形成复合查询,其中两个查询必须由文档满足才能被视为匹配。 bool查询用于以这种方式组合查询 ,使用must子句指定必须满足两个查询。 这是一个使用对象初始化器语法的示例

 var client = new ElasticClient(); var indexName = "index-name"; var mustClauses = new List(); 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(indexName) { Size = 10, From = 0, Query = new BoolQuery { Must = mustClauses } }; var searchResponse = client.Search(searchRequest); 

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

 var indexName = "index-name"; var mustClauses = new List(); var filterClauses = new List(); mustClauses.Add(new TermQuery { Field = new Field("description"), Value = "white" }); filterClauses.Add(new NumericRangeQuery { Field = new Field("price"), LessThanOrEqualTo = 3000, GreaterThanOrEqualTo = 2000 }); var searchRequest = new SearchRequest(indexName) { Size = 10, From = 0, Query = new BoolQuery { Must = mustClauses, Filter = filterClauses } }; var searchResponse = client.Search(searchRequest);