ElasticSearch嵌套聚合过滤后计算嵌套字段中位数异常排查
解决ElasticSearch嵌套字段过滤后计算中位数失效的问题
嘿,我仔细看了你的问题和代码,发现过滤没生效的原因出在几个字段名的错误上,这直接导致你的过滤条件根本没匹配到任何数据,所以结果和无过滤时一致。咱们一步步来修正:
问题根源拆解
- 过滤字段名不匹配:你的示例文档里嵌套对象的字段是
not_wanted_1和not_wanted_2,但查询里写的是people.attr_not_wanted1/people.attr_not_wanted2,完全对不上,过滤自然起不了作用。 - 嵌套上下文内的字段前缀冗余:进入
nested聚合的上下文后,已经处于people对象的层级里,不需要再给字段加people.前缀,否则ES会去查找嵌套对象内部的people.not_wanted_1字段,这显然不存在。 - 中位数计算字段不匹配:你预期用
review_count(20和18)计算中位数,但查询里用的是people.for_median_attr,和文档里的字段也对应不上。
修正后的查询语句
{ "query": { "bool": { "filter": [ { "term": { "date": "2020-05-18" } }, { "term": { "group_name": "some_name" } } ] } }, "aggs": { "median_value": { "nested": { "path": "people" }, "aggs": { "filtered_valid_people": { "filter": { "bool": { "must": [ { "term": { "not_wanted_1": false } }, { "term": { "not_wanted_2": false } } ] } }, "aggs": { "median_review_count": { "percentiles": { "field": "review_count", "percents": [50], "keyed": false // 可选,让返回结果更简洁,只返回50分位的数值 } } } } } } } }
关键修改说明
- 外层
query保持不变,负责过滤整个文档的date和group_name。 nested聚合切换到people嵌套对象的上下文,后续聚合都基于这个层级。filtered_valid_people过滤聚合:只保留not_wanted_1和not_wanted_2都为false的people对象,字段名完全匹配文档,且去掉了冗余的people.前缀。- 最后在过滤后的结果上,针对
review_count字段计算50分位数(即中位数),这样就只会用你预期的20和18这两个数值计算,结果为19,符合预期。
验证效果
执行这个查询后,返回的聚合结果里,median_review_count会给出50分位的数值,也就是(20+18)/2=19,完全符合你想要的结果。
内容的提问来源于stack exchange,提问作者km271
相关产品推荐
相关产品推荐

