2017-03-04 95 views
0

我使用C#与的NuGet packeges;弹性搜索5.x中嵌套多个查询C#

<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); 
      } 
     } 
    } 

但它不工作,因为请求已经全成但在结果没有文件(S),但我有。我可以用Sense插件查看文档。

如果合并两个查询,鸟巢将扔在运行时异常(表示:“QueryContainer只能容纳一个查询中已经包含了TermQuery”)。这里是;

Nest throws exception

而且,我无法用流利的API,因为我传递参数给我的仓库般的功能;

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

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

回答

3

你试图做的是从两个查询,在这两个查询必须由一个文件,以满足它被认为是匹配形成一个复合查询。 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查询filter条款

var indexName = "index-name"; 
var mustClauses = new List<QueryContainer>(); 
var filterClauses = new List<QueryContainer>(); 

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<Product>(indexName) 
{ 
    Size = 10, 
    From = 0, 
    Query = new BoolQuery 
    { 
     Must = mustClauses, 
     Filter = filterClauses 
    } 
}; 

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