Elasticsearch百分位数聚合结果异常,如何修正查询获正确值?
问题分析与解决方案
问题原因
metrics字段是nested类型,这类字段的文档是独立存储的,普通聚合无法直接穿透嵌套结构访问内部的metrics.data.weightedqualityscore字段。原查询直接对嵌套字段执行百分位聚合时,Elasticsearch会在根文档层级查找该字段,而根文档本身并不包含这个字段,因此所有数据都被判定为缺失,最终返回missing参数设置的10.0。
修正后的查询语句
必须先通过nested聚合进入metrics的嵌套上下文,再在该上下文中执行百分位聚合,才能正确读取嵌套字段的值:
GET /index-name/_search { "from": 0, "query": { "bool": { "filter": [ { "terms": { "providerid": [ 2000019314, 2000041586, 2000060152 ] } } ] } }, "aggs": { "nested_metrics": { "nested": { "path": "metrics" }, "aggs": { "quality_score_percentiles": { "percentiles": { "field": "metrics.data.weightedqualityscore", "percents": [50,75], "missing": 10 } } } } }, "size": 10 }
修正说明
- 新增
nested_metrics聚合,指定path: "metrics"进入嵌套文档的上下文。 - 将原有的
quality_score_percentiles百分位聚合嵌套在nested_metrics内部,此时聚合会在嵌套文档层面读取metrics.data.weightedqualityscore的值,就能计算出正确的百分位数:50分位数为71,75分位数为71.75。
内容的提问来源于stack exchange,提问作者user2506233
相关产品推荐
相关产品推荐

