在Elastic search中,如果我有带有属性的文档,请说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次)。
应该有一些更简单的方法可以做到这一点。
提前致谢
最佳答案
您提到的带有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(',')"
}
}
}
}
}