【问题标题】:elastic search aggregation on more than one field多个字段的弹性搜索聚合
【发布时间】:2015-07-25 17:58:33
【问题描述】:

我是弹性搜索的新手,我想在上面实现一个特定的用例。我想要一个多字段总和聚合。我将尝试举例说明: 我在 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}

谁能告诉我如何做到这一点?我尝试了嵌套显着术语和总和聚合,但没有成功。 提前致谢。

【问题讨论】:

    标签: elasticsearch aggregation


    【解决方案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
                                     }
                                  }
                               ]
    }}]}}]}}}
    

    【讨论】:

    • 这正是我所做的,但它非常慢,我不知道如何浏览结果,目前我只收到一个结果 - 我的意思是只有一个顶级 lvl 聚合,并且有应该是很多我不知道如何访问下一个
    • 这听起来像是您尝试使用的客户端的问题。你什么都没提到
    • 我只是想用一个叫做 sense 的奇迹插件写一个查询。正如我所说,我是个菜鸟,我的方法不正确吗?
    • 我也使用了 Sense :-)。使用您的确切数据和查询时得到的输出更新了我的答案。
    • 是的,我看到了,感谢您的帮助。问题是我有这么大的索引,它似乎没有返回所有可能的聚合
    猜你喜欢
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多