我使用ElasticSearch索引某些用户属性,用户数据mondel如下所示,fxy
是在gx
组下组合在一起的一组属性
User: {
g1: {
f11: ...,
f12: ...,
f13: ...
},
g2: {
f21: ...,
f22: ...,
f23: ...
}
}
所以我可以通过使用嵌套聚合
获得f11
的前N个结果
{
"query": {
...
},
"aggs": {
"l1": {
"nested": {
"path": "g1"
},
"aggs": {
"l2": {
"terms": {
"field": "g1.f11"
}
}
}
}
}
}
并且响应就像
{
"aggregations": {
"l1": {
"doc_count": .....,
"l2": {
"buckets": [
{
"key": k1,
"doc_count": ...
},
{
"key": k2,
"doc_count": ...
}
...
]
}
}
}
}
我的问题是嵌套聚合中的所有doc_count
都是gx
和fxy=kz
的数字。有没有办法让至少有一个gx
的用户满意fxy=kz
?
答案 0 :(得分:0)
目前我们的解决方法是
f11
的前N个结果
这意味着
将映射更改为
User: {
g1_f11: [],
g1_f12: [],
...
g2_f21: [],
g2_f22: [],
...,
g1: {
f11: ...,
f12: ...,
f13: ...
},
g2: {
f21: ...,
f22: ...,
f23: ...
}
}
获取字段f11
的前N个结果,然后作为过滤器的一部分应用,并在g1_f11
上汇总
{
"query": {
"nested": {
"path": "g1",
"query": {
"should": [
{
"match": {
"g1" {
"query": "k1"
}
}
},
{
"match": {
"g1" {
"query": "k2"
}
}
},
...
]
}
}
},
"aggs": {
"l1": {
"terms": {
"fields": "g1_f11"
}
}
}
}
然后聚合输出中的最终doc_count
将是用户数
答案 1 :(得分:0)
发现事实证明ElasticSearch确实提供了解决方案:reverse nested aggregation。这正是我们想要的。