Elasticsearch如何忽略映射 解决数值类型混合写入float转long报错问题
Elasticsearch 字段类型冲突报错解决说明
你遇到的是Elasticsearch典型的字段映射不可变冲突:该字段第一次写入值为浮点数时,动态映射自动将data.path.witnesses.snr推断为float类型,Lucene底层索引结构决定了字段类型一旦确定就无法修改,后续写入long类型值就会触发如下报错:
{"error":{"root_cause":[{"type":"illegal_argument_exception","reason":"mapper [data.path.witnesses.snr] cannot be changed from type [float] to [long]"}],"type":"illegal_argument_exception","reason":"mapper [data.path.witnesses.snr] cannot be changed from type [float] to [long]"},"status":400}
不能通过直接忽略映射规则的方式规避该报错,强制跳过映射校验只会导致数据索引异常甚至整条写入失败,可采用以下方案解决:
- 方案一:提前显式设置兼容类型
创建索引时提前指定data.path.witnesses.snr的类型为float或double,这两类数值类型可同时兼容存储整数和浮点数,不会触发类型冲突。示例映射配置如下:PUT <你的索引名称> { "mappings": { "properties": { "data": { "properties": { "path": { "properties": { "witnesses": { "properties": { "snr": { "type": "float" } } } } } } } } } } - 方案二:开启
coerce强制类型转换
给该字段配置coerce: true参数,ES会自动将写入的整数值转换为float类型存储,无需修改上游写入的源数据。配置示例:"snr": { "type": "float", "coerce": true } - 方案三:配置
ignore_malformed跳过异常字段
若不需要保留类型不匹配的字段值,可给该字段设置ignore_malformed: true,遇到类型冲突时仅跳过该字段的索引,不会导致整条数据写入失败。注意该方案会丢失冲突字段的内容。 - 方案四:重建索引适配类型
若索引已有存量数据,可先创建配置了正确映射的新索引,通过_reindex接口迁移存量数据,再切换写入流量到新索引即可。
内容的提问来源于stack exchange,提问作者Nick Hatfield
相关产品推荐
相关产品推荐

