弹性搜索:如何获取3个或更多字段的多个组合的结果

时间:2016-06-02 08:55:56

标签: elasticsearch

在弹性搜索中,如果我有包含attribtutes的文档说Foo Bar Baz Qux和其他一些属性。

我需要以这样的方式查询,以便以下面的方式得到结果

Foo Bar Baz Qux
foo1 bar1 baz1 qux1
foo1 bar1 baz1 qux2
foo1 bar1 baz2 qux1
foo1 bar1 baz2 qux2
foo1 bar2 baz1 qux1

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

原油方式是,在terms聚合中使用terms聚合(在这种情况下为4次)。

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

先谢谢

1 个答案:

答案 0 :(得分:1)

使用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(',')"
                   }
               }
           }
     }
}