关于es聚合查询指标过滤并限制返回结果数量的问题

{
"size": 0,
"query": {
"bool": {
"filter":
}
},
"track_total_hits": false,
"aggregations": {
"my_buckets": {
"composite": {
"size": 5,
"sources": [
{
"eventTime.keyword": {
"terms": {
"field": "eventTime.keyword",
"missing": ""
}
}
},
{
"model.keyword": {
"terms": {
"field": "model.keyword",
"missing": ""
}
}
},
{
"aaid.keyword": {
"terms": {
"field": "aaid.keyword",
"missing": ""
}
}
},
{
"1f82b8a0": {
"sum": {
"field": "dataType"
}
}
}
]
},
"aggs": {
"1f82b8a0": {
"sum": {
"field": "dataType"
}
},
"111df5af": {
"sum": {
"field": "appId"
}
},
"u1Mdpy-4niN85-hUx47A_bucket": {
"bucket_selector": {
"buckets_path": {
"a04aa8832": "1f82b8a0"
},
"script": {
"source": "params.a04aa8832>=5"
}
}
},
"sort_bucket": {
"bucket_sort": {
"sort": [
{
"1f82b8a0": {
"order": "desc"
}
}
]
}
}
}
}
}
}

我想实现类似sql中聚合查询having过滤,并限制返回结果的数量。可是并没有找到适合的查询方式。要么是返回数据量不好控制,要么是返回结果不合人意。恳请诸位大佬指点迷津!感谢!以上是我的采用过的不符合的查询方式之一。

不清楚你的具体需求,可以看一下这个有没有帮助:

首先,谢谢您百忙之中的回复!

 但是这个好像不能解决我的问题。我想实现这样的SQL:

select colum1,column2,column3,column4,sum(column5),avg(column6)
from table
group by column1,column2,column3,column4 having sum(column5) > 500 and avg(column6) >1000 limit 1000

  如果按照你推荐文档,确实可以实现聚合。但是在表数据量很大的情况下,难以控制聚合结果的数据量。

  即使对每个aggs的纬度字段都设置size,也不能准确的控制聚合结果的数量。

  后来,我采用了复合聚合composite,但是它对bucket_selector的兼容性好像不是很理想。

  复合聚合使用bucket_selector只是对查询结果在内存中过滤,在限制数据量的情况下,发现有空桶占位的现象。

  所以,我不知道是es暂时不支持我这样的需求,还是我对es不够熟悉。希望大佬能够提供下帮助。

 谢谢!期待您的回复!

是的,pipeline aggregation 和 composite aggregation不兼容。

即使对每个aggs的纬度字段都设置size,也不能准确的控制聚合结果的数量。

能详细解释一下为什么不能准确控制聚合结果的数量?

场景是这样的,还是以上面的SQL为例子:
select colum1,column2,column3,column4,sum(column5),avg(column6)
from table
group by column1,column2,column3,column4 having sum(column5) > 500 and avg(column6) >1000 limit 1000
在es中使用 pipeline aggregation实现该sql的需求,我必须aggs每个维度字段,并将他们内嵌下去。如:
{
"size": 0,
"query": {
"bool": {
"filter":
}
},
"track_total_hits": true,
"aggregations": {
"coulumn1": {
"terms": {
"field": "coulumn1",
"missing": "",
"size": 10
},
"aggs": {
"coulumn2": {
"terms": {
"field": "coulumn2",
"missing": "",
"size": 10
},
"aggs": {
"coulumn3": {
"terms": {
"field": "coulumn3",
"missing": "",
"size": 10
},
"aggs": {
"coulumn4": {
"terms": {
"field": "coulumn4",
"missing": "",
"size": 10
},
"aggs": {
"1f82b8a0": {
"sum": {
"field": "column5"
}
},
"111df5af": {
"avg": {
"field": "column5"
}
},
"u1Mdpy-4niN85-hUx47A_bucket": {
"bucket_selector": {
"buckets_path": {
"a04aa8832": "1f82b8a0"
},
"script": {
"source": "params.a04aa8832>500"
}
}
}
}
}
}
}
}
}
}
}
}
}
这种聚合方式好像只能通过设置每个aggs聚合维度字段的size来控制大小,在我数据量满足的情况下。查询的总体数量是随着我维度字段的数据递增的,增长方式是:10 * 10 * 10 * 10,是每个size的乘积;
这样我在大量维度下就无法控制聚合返回的数据量了。
当然,也可能是我对ES不是很熟,没有找到正确的查询配置方式,还请指正!
谢谢!

对的,无法实现你的例子中的 limit 1000。正如你说的,Es是的多个字段分组其实是嵌套的聚合,只能控制每一层嵌套的聚合的文档数量。

多谢您的解答!衷心希望后续es能支持!