2016-09-05 23 views
0

我正在使用ElasticClient 2.4.4。在Elasticsearch中计算过滤的数据(ElasticClient嵌套)

我有一个查询

var sample = client.Search<TestMenuItem>(s => s 
      .Query(q => 
       q.Term(p => p.RegionSegments, "s1") 
       && q.Term(p => p.RegionSegments, "s2") 
       && q.Term(p => p.RegionSegments, "s3") 
      )); 

比我想指望有多少项目是与RegionSegments = S1。 据我了解,我应该使用聚合,但无法找到很好的例子如何解决这个问题。任何想法?

回答

1

如果你只是需要每个s1s2s3 RegionSegment文件的数量,那么你可以做这样一个multi_search,指定计数search_type所有

var multiSearchResponse = client.MultiSearch(ms => ms 
    // this is the default index for multi_search. Can override 
    // on each Search call if needed 
    .Index<TestMenuItem>() 
    // this is the default type for mulit_search. Can override 
    // on each search call if needed 
    .Type<TestMenuItem>() 
    // this is the default search_type. Can override on 
    // each search call if needed 
    .SearchType(SearchType.Count) 
    .Search<TestMenuItem>("s1", s => s 
     .Query(q => +q.Term(p => p.RegionSegments, "s1")) 
    ) 
    .Search<TestMenuItem>("s2", s => s 
     .Query(q => +q.Term(p => p.RegionSegments, "s2")) 
    ) 
    .Search<TestMenuItem>("s3", s => s 
     .Query(q => +q.Term(p => p.RegionSegments, "s3")) 
    ) 
); 

这将产生以下要求

POST http://localhost:9200/testmenuitem-index/testmenuitem/_msearch?search_type=count 
{} 
{"query":{"bool":{"filter":[{"term":{"regionSegments":{"value":"s1"}}}]}}} 
{} 
{"query":{"bool":{"filter":[{"term":{"regionSegments":{"value":"s2"}}}]}}} 
{} 
{"query":{"bool":{"filter":[{"term":{"regionSegments":{"value":"s3"}}}]}}} 

要获得每个搜索结果的总计与以下内容类似

var s1Total = multiSearchResponse.GetResponse<TestMenuItem>("s1").Total; 
+0

不完全。首先,我需要得到一些查询结果,然后根据这个查询结果进行计算。 – user1541069

+0

RegionSegments是一个像这样的字符串's1 s2 s3'或's3 s2' – user1541069

+0

是对RegionSegments进行分析的吗?你需要在's1'还是's2'或's3'上完全匹配*? –