Elasticsearch对象字段聚合返回错误数值问题咨询
解决Elasticsearch对象字段聚合返回错误数值的问题
这个问题我之前也碰到过,核心原因是你用了object类型来存储数组形式的嵌套对象,而Elasticsearch对object类型的处理方式会破坏数组元素里字段的关联关系。
问题根源
当你把products_categories_id定义为object类型,同时存储的是对象数组时,Elasticsearch会自动将数组里所有对象的字段扁平化处理:
- 所有
id会被合并成一个多值字段:[164, 443, 450] - 所有
value也会被合并成一个多值字段:["Flight Case e Accessori...", "Chitarre - Supporti...", ...]
这就导致字段间的关联彻底丢失了——聚合时ES无法知道id:164对应的是value:"Flight Case...",最终返回的聚合结果就是错乱的数值。
解决方案:改用nested类型
要保留数组对象里字段的关联关系,必须把products_categories_id的类型修改为nested,它会将数组中的每个对象当作独立的子文档存储,完美保留字段间的对应关系。
1. 更新索引映射
首先需要修改你的索引映射,将products_categories_id改为nested类型:
{ "mappings": { "properties": { "products_categories_id": { "type": "nested", "properties": { "id": {"type": "integer"}, "value": {"type": "text"}, "singular_value": {"type": "text"} } } } } }
注意:如果索引已经存在,你无法直接修改现有字段的类型,需要创建一个新的带正确映射的索引,然后将原数据重新导入到新索引中。
2. 编写正确的聚合查询
使用nested聚合来指定要操作的嵌套字段路径,然后在内部进行你需要的聚合操作(比如按id或value聚合):
{ "aggs": { "nested_categories": { "nested": { "path": "products_categories_id" }, "aggs": { "category_ids": { "terms": { "field": "products_categories_id.id" }, "aggs": { "category_names": { "terms": { "field": "products_categories_id.value.keyword" } } } } } } } }
这个查询会先遍历每个products_categories_id子文档,然后正确关联id和value进行聚合,返回的结果就不会出现错误数值了。
内容的提问来源于stack exchange,提问作者Lib3Ns
相关产品推荐
相关产品推荐

