在Elastic search中,如果我有带有属性的文档,请说Foo Bar Baz Qux以及许多其他属性。

我需要以以下方式查询结果

Foo Bar Baz Qux foo1 bar1 baz1 qux1foo1 bar1 baz1 qux2foo1 bar1 baz2 qux1foo1 bar1 baz2 qux2foo1 bar2 baz1 qux1
基本上,我需要doc_count可用的所有组合。使用结果,可以说 Foo = foo1,Bar = bar1,Baz = baz1,Qux = qux1,共有20个文档/记录

粗略的方法是在terms聚合内使用terms聚合(在这种情况下为4次)。

应该有一些更简单的方法可以做到这一点。

提前致谢

最佳答案

您提到的带有4个嵌入式terms聚合的方法是一个不错的方法。

另一种方法是将单个terms聚合与script结合使用,这将创建由您要聚合的四个术语组成的假术语,如下所示:

{
   "size": 0,
   "aggs": {
      "combinations": {
          "terms": {
              "script": "[doc.foo.value, doc.bar.value, doc.baz.value, doc.qux.value].join(',')"
          }
      }
   }
}

注意:请确保enable dynamic scripting以便使用上面的脚本聚合。

为了在搜索时节省一些周期的另一种解决方案是在索引时在另一个字段中创建该聚合项,然后将其用于单个terms聚合中。

编辑:
如果结果的顺序很重要,则应根据foo的doc_count进行排序
{
   "size": 0,
   "aggs": {
        "primary": {
            "terms": {
                "field": "foo"
            },
           "aggs": {
               "combinations": {
                   "terms": {
                   "script": "[doc.foo.value, doc.bar.value, doc.baz.value, doc.qux.value].join(',')"
                   }
               }
           }
     }
}

10-08 04:01