ElasticSearch内部keyword字段执行terms聚合时抛出异常
解决Elasticsearch Keyword字段聚合触发Fielddata错误的问题
我太懂这种诡异的感觉了——明明确认是keyword字段,聚合时却弹出text字段才会有的fielddata禁用错误!别慌,这大概率是映射细节或者索引配置的坑,咱们一步步排查:
先确认字段的真实映射
首先别光凭印象判断,用命令精准导出该字段的映射:
GET /<你的索引名>/_mapping/field/prop.field_name
仔细看返回的结果:
- 如果结果里显示
"type": "keyword",那继续往下排查; - 如果发现字段是text类型+keyword子字段(比如
prop.field_name本身是text,而prop.field_name.keyword才是keyword类型),那问题就出在这!你应该聚合prop.field_name.keyword而不是原字段——很多新手会把multi-field的主字段和子字段搞混。
排查索引别名/多索引问题
如果字段确实是keyword类型,那看看你是不是用了索引别名,而别名指向的多个索引里,有某个索引的prop.field_name是text类型?
用命令查看别名对应的所有索引:
GET /_alias/<你的别名>
如果别名包含了不同映射的索引,聚合时会因为字段类型不统一触发错误,这时候要么修正其他索引的映射,要么聚合时指定具体索引而非别名。
检查字段名的大小写/拼写
Elasticsearch的字段名是大小写敏感的!比如你聚合的是prop.field_name,但实际映射里是prop.FieldName,那系统会找不到对应的keyword字段,甚至可能匹配到其他同名的text字段(如果有的话)。
最后试试刷新索引
如果以上都没问题,可能是索引元数据缓存的问题,刷新一下索引再重试:
POST /<你的索引名>/_refresh
举个例子,如果你的聚合请求写错了字段,正确的聚合应该是针对keyword子字段:
{ "aggs": { "field_name_agg": { "terms": { "field": "prop.field_name.keyword" // 这里用子字段 } } } }
内容的提问来源于stack exchange,提问作者Robert Wille
相关产品推荐
相关产品推荐

