2014-09-29 88 views
1

我正在使用NEST來查詢ElasticSearch,我正在創建一個條件篩選器。我需要查詢匹配類別和可選的標題和章節字段。我正在做一個聚合來獲得獨特的價值。問題是過濾器似乎在過濾器字段上做了一個OR操作。任何想法我在這個例子中做錯了什麼?用於ElasticSearch的NEST篩選器

FilterContainer filter = new FilterContainer(); 

filter = Filter<Page>.Term("category", "1575"); 

if (title != null) 
{ 
    filter &= Filter<Page>.Term("title", title); 
} 

if (chapter != null) 
{ 
    filter &= Filter<Page>.Term("chapter", chapter); 
} 

var result = client.Search<Page>(s => s 
    .Index(index) 
    .Filter(filter) 
    .Size(0) 
    .Aggregations(a => a 
     .Terms("my_agg", st => st 
      .Field("title") 
     ) 
    ) 
); 

var myAgg = result.Aggs.Terms("my_agg"); 
IList<KeyItem> lst = myAgg.Items; 
return lst; 

回答

4

這會給你所有行的結果,因爲你的過濾器根本不會用於聚合。因此,看起來過濾器正在執行OR操作。根據您的要求,您需要使用過濾器聚合,其中過濾器是在聚合中指定的。有關更多信息,請參閱http://www.elasticsearch.org/guide/en/elasticsearch/reference/master/search-aggregations-bucket-filter-aggregation.html

爲了您的目的,下面是創建搜索請求和處理響應的更新代碼。

var result = client.Search<Page>(s => s 
    .Index(index) 
    .Size(0) 
    .Aggregations(fa => fa 
     .Filter("filtered_aggs", f => f 
      .Filter(fd => filter) 
       .Aggregations(ta => ta 
        .Terms("my_agg", st => st 
         .Field("title") 
        ) 
       ) 
      ) 
     ) 
    ) 
); 

var myAgg = result.Aggs.Nested("filtered_aggs").Terms("my_agg"); 
IList<KeyItem> lst = myAgg.Items; 
return lst;