Elasticsearch经dynamic_templates映射后object字段查询与聚合失效问题
问题根因
你当前的配置存在两处核心问题导致查询和聚合失效:
- 你为
property.innerProperty.*配置了dynamic: false的object类型映射,这会导致constantKey下的所有子字段(如示例中的someArrays)不会被ES自动索引。而ES的exists查询判断object类型字段是否存在的逻辑是:该object下是否有至少一个被索引的子字段存在有效值,因此ES会判定constantKey为空,返回空查询结果。 terms聚合无法直接作用于object类型字段,terms仅支持对keyword、数值、布尔等简单值类型,或nested类型的子字段执行聚合计算。
解决方案
根据你的需求(按constantKey聚合统计文档数、实现facets),可选择以下两种适配方案:
方案1:仅需统计innerProperty下各常量键的文档计数
如果你不需要检索constantKey内部的子字段,只需要判断键是否存在、按键聚合,将映射改为flattened类型即可,该类型会将整个object作为单一字段索引,支持exists查询和键聚合:
{ "dynamic_templates": [ { "property_map": { "path_match": "property.innerProperty.*", "mapping": { "type": "flattened" } } } ] }
修改映射后重建索引、重新导入数据,你原先的exists查询即可正常返回结果。如果要聚合所有常量键的文档计数,使用以下聚合语句:
GET /index/_search { "aggs": { "constantKey_facets": { "terms": { "field": "property.innerProperty", "size": 100 } } }, "size": 0 }
方案2:需要同时检索/聚合constantKey内部的子字段
如果你需要访问constantKey下的子字段(如示例中的someArrays.id),请在动态模板中显式声明子字段的映射,开启索引能力:
{ "dynamic_templates": [ { "property_map": { "path_match": "property.innerProperty.*", "mapping": { "type": "object", "properties": { "someArrays": { "type": "nested", "properties": { "id": { "type": "keyword" } } } } } } } ] }
修改映射重建索引后,你原先的exists查询即可正常生效,如果需要按someArrays.id做聚合,使用nested聚合即可:
GET /index/_search { "aggs": { "id_facets": { "nested": { "path": "property.innerProperty.constantKey.someArrays" }, "aggs": { "id_count": { "terms": { "field": "property.innerProperty.constantKey.someArrays.id", "size": 100 } } } } }, "size": 0 }
内容的提问来源于stack exchange,提问作者Celal Yildirim
相关产品推荐
相关产品推荐

