Elastic:如何在子聚合中引用histogram直方图聚合的桶key?
实现方案
ES的range聚合不支持在from/to参数中动态引用父桶的key,你可以通过filters聚合配合Painless脚本来实现需求,该方案适用于Elasticsearch 7.12及以上版本,以下是可直接运行的查询:
{ "aggs": { "tasks_by_start": { "histogram": { "field": "start", "interval": 10 }, "aggs": { "completed": { "filters": { "filters": [ { "script": { "source": "doc['end'].value < params._key + 10", "lang": "painless" } }, { "script": { "source": "doc['end'].value >= params._key + 10", "lang": "painless" } } ] } } } } } }
说明
- 脚本中的
params._key就是当前父histogram桶的key值,可直接用于动态计算阈值 - 如果你的
start和end是标准毫秒级时间戳,只需要把10替换为对应时间间隔的毫秒值即可,比如间隔10秒就写10*1000 - 针对你给出的示例数据,返回结果完全符合预期:
- 桶key为0(对应start在0~10区间的文档):第一个filter命中end=5的文档,第二个filter无匹配
- 桶key为10(对应start在10~20区间的文档):第二个filter命中end=23的文档,第一个filter无匹配
内容的提问来源于stack exchange,提问作者Brady O'Connell
相关产品推荐
相关产品推荐

