Elasticsearch按category分组sum聚合结果全部一致问题排查
问题原因
你编写的查询存在2个核心问题,是聚合结果不符合预期的直接原因:
- 语法错误:terms聚合的field参数中,字段名
category未加双引号,不符合JSON语法规范。如果ES使用宽松解析模式,未加引号的字段名会被识别为无效值,导致分组规则失效,sum聚合会统计全量文档的price值,最终每个分组的sum结果都是全量总和18。 - 不必要的嵌套:外层套了多余的global聚合,如果你没有同时携带query过滤条件,不需要用global聚合包裹terms分组,冗余的嵌套也可能在部分ES版本中引发解析异常。
正确查询写法
{ "size": 0, "aggs": { "group_by_category": { "terms": { "field": "category", "size": 10000 }, "aggs": { "sum_price": { "sum": { "field": "price" } } } } } }
补充说明:size: 0用于关闭原始文档返回,仅返回聚合结果,降低查询开销。
额外排查项
如果修正语法后问题仍然存在,需要检查索引映射:
- 确认
category字段为数值类型(integer/long)或keyword类型,不能是text类型,text类型的分词规则会导致分组混乱 - 确认
category字段不是数组类型,若单个文档的category字段同时包含多个分类值,会导致单文档落入多个分组,sum统计结果异常
内容的提问来源于stack exchange,提问作者Rui Gonçalves
相关产品推荐
相关产品推荐

