首页 > 解决方案 > 全数组的 Elasticsearch 聚合

问题描述

我如何通过文档中的所有数组项而不是数组的每个值来聚合。例如我有几个文件,像这样

{'some_field': [1,2]}
{'some_field': [1]}
{'some_field': [1]}
{'some_field': [7,2]}

现在有了这样的简单聚合查询

{
"aggs" : {
    "agg_name" : {
        "terms" : {
            "field" : "some_field"
        }
    }
},
"size": 0
}

我得到了这样的结果

"buckets": [
        {
          "key": "1",
          "doc_count": 3
        },
        {
          "key": "2",
          "doc_count": 2
        },
        ...
]

但我想获得完整的数组视图,像这样

"buckets": [
        {
          "key": [1],
          "doc_count": 2
        },
        {
          "key": [1,2],
          "doc_count": 1
        },
        {
          "key": [7,2],
          "doc_count": 1
        },
]

标签: elasticsearchelasticsearch-aggregation

解决方案


我一直在寻找相同的聚合,但仍然不存在。所以用一个无痛的脚本修复

POST some_index/_search
{
  "size": 0,
  "aggs": {
    "myaggs": {
      "terms": {
        "size": 100,
        "script": {
          "lang": "painless",
          "source": """
            def myString = "";
            for (int i = 0; i < doc['data. some_field.keyword'].length; ++i) {
              myString += doc['data. some_field.keyword'][i] + ", ";
            }
            return myString;
          """
        }
      }
    }
  } 
}

推荐阅读