Elasticsearch提示无法无损转换为Long报错 如何通过动态模板解决
Elasticsearch类型转换报错解决方案
结论
可以通过动态模板规避该报错。
报错根因
Elasticsearch默认开启字段类型自动推断:如果第一个写入索引的alert.number字段值为长整型,ES会自动将该字段的映射类型设置为long。后续写入浮点型、科学计数法字符串格式的number值时,ES强制转换为long类型会出现精度损失,触发报错。
可选动态模板方案
你可以根据业务需求选择以下两种方案:
方案1:映射为double类型(保留数值计算能力)
如果后续需要对number字段做范围查询、数值聚合,将字段映射为double即可兼容长整型、浮点型、合法科学计数法字符串三种输入格式,不会触发精度损失报错:
PUT <你的索引名称> { "mappings": { "dynamic_templates": [ { "alert_number_match": { "path_match": "alert.number", "mapping": { "type": "double" } } } ] } }
方案2:映射为keyword类型(完全规避类型转换)
如果不需要对number字段做数值计算,仅需存储原始值做精确匹配,可将字段映射为keyword类型,所有输入值都会转为字符串存储,不会触发任何类型转换报错:
PUT <你的索引名称> { "mappings": { "dynamic_templates": [ { "alert_number_match": { "path_match": "alert.number", "mapping": { "type": "keyword" } } } ] } }
注意事项
动态模板仅对新创建的索引、以及索引中尚未生成映射的新字段生效。如果当前索引已经存在且alert.number字段已经被自动映射为long类型,你需要重建索引并重新设置映射规则才能生效。
内容的提问来源于stack exchange,提问作者Dennis
相关产品推荐
相关产品推荐

