在elasticsearch中,如果我有带有Foo Bar Baz Qux属性的文档说,还有其他一些属性。
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
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次)。
terms
应该有一些更简单的方法可以做到这一点。
提前致谢
您提到的4种嵌入式terms聚合方式是一个很好的方法。
另一种方法是将单个terms聚合与一起使用script,这将创建由您要聚合的四个术语组成的假术语,如下所示:
script
{ "size": 0, "aggs": { "combinations": { "terms": { "script": "[doc.foo.value, doc.bar.value, doc.baz.value, doc.qux.value].join(',')" } } } }
注意:请确保启用动态脚本,以使用上述脚本聚合。
为了在搜索时节省一些周期的另一种解决方案是在索引时在另一个字段中创建该聚合项,然后将其用于单个terms聚合中。
编辑:如果结果的顺序很重要,则应基于doc_count进行排序 foo
foo
{ "size": 0, "aggs": { "primary": { "terms": { "field": "foo" }, "aggs": { "combinations": { "terms": { "script": "[doc.foo.value, doc.bar.value, doc.baz.value, doc.qux.value].join(',')" } } } } }