Elasticsearch 聚合最常见的整数列表

Elasticsearch Aggregation most common list of integers

我正在寻找弹性搜索聚合+映射 这将 return 最常见的 list 用于特定字段。 例如对于文档: {"ToneCurvePV2012": [1,2,3]} {"ToneCurvePV2012": [1,5,6]} {"ToneCurvePV2012": [1,7,8]} {"ToneCurvePV2012": [1,2,3]}

我希望聚合结果: [1,2,3](因为它出现了两次)。

到目前为止,我所做的任何聚合都会 return: 1

默认术语聚合无法做到这一点。您需要将术语聚合与脚本一起使用。请注意,这可能会影响您的集群性能。

在这里,我使用了将从数组创建字符串并将其用于聚合的脚本。因此,如果您有像 [1,2,3] 这样的数组值,那么它会像 '[1,2,3]' 这样创建它的字符串表示形式,并且该键将用于聚合。

下面是您可以用来生成预期聚合的示例查询:

POST index1/_search
{
  "size": 0,
  "aggs": {
    "tone_s": {
      "terms": {
      "script": {
        "source": "def value='['; for(int i=0;i<doc['ToneCurvePV2012'].length;i++){value= value + doc['ToneCurvePV2012'][i] + ',';} value+= ']'; value = value.replace(',]', ']'); return value;"
      }
      }
    }
  }
}

输出:

{
 "hits" : {
    "total" : {
      "value" : 4,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "tone_s" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "[1,2,3]",
          "doc_count" : 2
        },
        {
          "key" : "[1,5,6]",
          "doc_count" : 1
        },
        {
          "key" : "[1,7,8]",
          "doc_count" : 1
        }
      ]
    }
  }
}

PS: 键在聚合响应中将作为字符串而不是数组出现。