Elasticsearch多项聚合,但在记录之间

ewm0tg9j  于 2023-03-29  发布在  ElasticSearch
关注(0)|答案(1)|浏览(95)

我在Elasticsearch中有一组记录,每个记录都有一些标签,即:

{ id: 0, tags: ["ant", "bird", "dog", "fox"]},
    { id: 1, tags: ["cat", "fox", "goose", "horse"]},
    { id: 2, tags: ["ant", "bird", "cat", "eel", "fox", "goose", "horse"]},
    { id: 3, tags: ["ant", "eel", "goose", "horse"]},
    { id: 4, tags: ["ant", "bird", "cat", "eel", "fox"]},
    { id: 5, tags: ["ant", "bird", "cat", "eel", "fox"]},
    { id: 6, tags: ["bird", "cat", "dog", "eel", "fox", "goose"]},
    { id: 7, tags: ["ant", "cat", "eel", "fox", "horse"]},
    { id: 8, tags: ["ant", "cat", "dog", "eel", "fox", "horse"]}

我想做一个multi_term聚合的等价物,但对tags的所有值,而不是对单独的字段。
因此,如果查找三个标签,结果将是:

...
    aggregations: {
        my_agg: {
            ....
            buckets: [
                { "key": ["ant", "cat", "eel"], ... "doc_count": 5 },
                { "key": ["ant", "cat", "fox"], ... "doc_count": 5 },
                { "key": ["ant", "eel", "fox"], ... "doc_count": 5 },
                { "key": ["cat", "eel", "fox"], ... "doc_count": 5 },
                { "key": ["ant", "bird", "fox"], ... "doc_count": 4 },
                { "key": ["ant", "bird", "fox"], ... "doc_count": 4 },
                { "key": ["ant", "eel", "horse"], ... "doc_count": 4 },
                { "key": ["bird", "cat", "eel"], ... "doc_count": 4 },
                { "key": ["bird", "cat", "fox"], ... "doc_count": 4 },
                { "key": ["cat", "fox", "horse"], ... "doc_count": 4 }
            ]
        }
    }

有什么好办法吗?

iovurdzv

iovurdzv1#

您可以尝试下面的查询来实现您正在寻找的。

POST /<your_index_name>/_search
{
  "size": 0,
  "aggs": {
    "my_agg": {
      "terms": {
        "script": {
          "source": """
            def tags = new ArrayList(doc['tags.keyword']);
            def combinations = new ArrayList();
            for (int i = 0; i < tags.size(); i++) {
              for (int j = i + 1; j < tags.size(); j++) {
                for (int k = j + 1; k < tags.size(); k++) {
                  combinations.add([tags[i], tags[j], tags[k]]);
                }
              }
            }
            return combinations;
          """
        }
      }
    }
  }
}

相关问题