2015-05-14 49 views
0

我是新增的弹性搜索,我想对其实施特定用例。我想要一个多场总和聚合。我会尝试在例子来解释: 我有以下插入ES索引对象:多个字段上的弹性搜索聚合

{"a":"aval", "b":"bval", "c":"cval", "aggcount":100} 

其中a,b和是字符串,aggcount是一个int。 现在让我们假设我有以下记录索引:

{"a":"aa", "b":"bb", "c":"cc", "aggcount":10} 
{"a":"aa", "b":"bb", "c":"cc", "aggcount":11} 
{"a":"aa", "b":"b", "c":"c", "aggcount":1} 
{"a":"a", "b":"bb", "c":"cc", "aggcount":12} 
{"a":"a", "b":"bb", "c":"cc", "aggcount":5} 

现在我想通过场想组记录a,b和c和总结他们的aggcount值,所以对于以前的纪录,我会得到以下结果:

{"a":"aa", "b":"bb", "c":"cc", "count":21} 
{"a":"aa", "b":"b", "c":"c", "count":1} 
{"a":"a", "b":"bb", "c":"cc", "aggcount":17} 

有人能告诉我如何做到这一点?我尝试嵌套significant_terms和总和聚合,但我没有成功。 在此先感谢。

回答

1

使用子聚合:

{ 
    "aggs": { 
    "aggs_a": { 
     "terms": { 
     "field": "a" 
     }, 
     "aggs": { 
     "aggs_b": { 
      "terms": { 
      "field": "b" 
      }, 
      "aggs": { 
      "aggs_c": { 
       "terms": { 
       "field": "c" 
       }, 
       "aggs": { 
       "summing": { 
        "sum": { 
        "field": "aggcount" 
        } 
       } 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 

测试数据和结果:

POST /test_index/test_type/_bulk 
{"index":{}} 
{"a":"aa", "b":"bb", "c":"cc", "aggcount":10} 
{"index":{}} 
{"a":"aa", "b":"bb", "c":"cc", "aggcount":11} 
{"index":{}} 
{"a":"aa", "b":"b", "c":"c", "aggcount":1} 
{"index":{}} 
{"a":"a", "b":"bb", "c":"cc", "aggcount":12} 
{"index":{}} 
{"a":"a", "b":"bb", "c":"cc", "aggcount":5} 

给出:

"hits": { 
     "total": 5, 
     "max_score": 0, 
     "hits": [] 
    }, 
    "aggregations": { 
     "aggs_a": { 
     "doc_count_error_upper_bound": 0, 
     "sum_other_doc_count": 0, 
     "buckets": [ 
      { 
       "key": "aa", 
       "doc_count": 3, 
       "aggs_b": { 
        "doc_count_error_upper_bound": 0, 
        "sum_other_doc_count": 0, 
        "buckets": [ 
        { 
         "key": "bb", 
         "doc_count": 2, 
         "aggs_c": { 
          "doc_count_error_upper_bound": 0, 
          "sum_other_doc_count": 0, 
          "buckets": [ 
           { 
           "key": "cc", 
           "doc_count": 2, 
           "summing": { 
            "value": 21 
           } 
           } 
          ]}}, 
        { 
         "key": "b", 
         "doc_count": 1, 
         "aggs_c": { 
          "doc_count_error_upper_bound": 0, 
          "sum_other_doc_count": 0, 
          "buckets": [ 
           { 
           "key": "c", 
           "doc_count": 1, 
           "summing": { 
            "value": 1 
           } 
           } 
          ]}]} 
      }, 
      { 
       "key": "a", 
       "doc_count": 2, 
       "aggs_b": { 
        "doc_count_error_upper_bound": 0, 
        "sum_other_doc_count": 0, 
        "buckets": [ 
        { 
         "key": "bb", 
         "doc_count": 2, 
         "aggs_c": { 
          "doc_count_error_upper_bound": 0, 
          "sum_other_doc_count": 0, 
          "buckets": [ 
           { 
           "key": "cc", 
           "doc_count": 2, 
           "summing": { 
            "value": 17 
           } 
           } 
          ] 
}}]}}]}}} 
+0

这正是我所做的,但它是超级慢,我不知道如何浏览结果,目前我只收到一个结果 - 我的意思是只有一个顶级lvl聚合,并且应该有许多我不知道如何访问下一个 – homar

+0

这听起来像是您尝试使用的客户端的问题。你还没有提到任何有关这个 –

+0

我只是想用奇迹插件来写一个叫做sense的查询。正如我所说我是一个不错的人,我的方法是不正确的吗? – homar