Elasticsearch:如何按指定categoryId聚合统计嵌套JDisc的颜色数量
解决嵌套路径聚合未筛选目标对象的问题
我明白你遇到的问题了——想统计categoryId=2的JDisc的color分布,结果却把所有JDisc的数据都聚合进来了对吧?这是因为嵌套类型的聚合需要严格按照层级关联筛选条件,我给你一步步讲清楚怎么修复:
第一步:确认你的Mapping配置
首先要确保JDiscs字段在Elasticsearch的mapping里被设置为nested类型,如果还是默认的object类型,嵌套对象会被扁平化存储,根本没法单独筛选某个JDisc对象。正确的mapping应该是这样的:
{ "mappings": { "properties": { "Property": { "type": "text" }, "JDiscs": { "type": "nested", "properties": { "color": { "type": "keyword" }, "categoryId": { "type": "integer" } } } } } }
第二步:使用正确的嵌套聚合DSL
你之前的错误应该是没有把筛选条件和嵌套聚合绑定在一起,导致只要文档里有一个符合条件的JDisc,就会把该文档所有JDisc都纳入统计。正确的做法是在nested聚合内部先过滤出目标JDisc,再做color统计:
{ "size": 0, // 不需要返回原始文档,只看聚合结果 "aggs": { "target_jdiscs": { "nested": { "path": "JDiscs" // 指定嵌套路径 }, "aggs": { "filter_category": { "filter": { "term": { "JDiscs.categoryId": 2 } // 筛选categoryId=2的JDisc }, "aggs": { "color_count": { "terms": { "field": "JDiscs.color" } // 统计符合条件的color分布 } } } } } } }
为什么这样能解决问题?
这个聚合的执行逻辑是:
- 先进入每个文档的
JDiscs嵌套对象层级 - 在这个层级里筛选出
categoryId=2的JDisc对象 - 只对这些筛选后的对象做color的terms聚合
这样你就能得到预期的"red":1结果了。
内容的提问来源于stack exchange,提问作者mongesh madhavan
相关产品推荐
相关产品推荐

