Elasticsearch 数值类型也能存String 类型,有点意思~
一、前言|
最近经常遇到遇到某个客户问数值类型的字段也能存字符串,或者说已经将字段类型设置成了float,但是实际存储的仍然是字符串,该如何解决,今天花点时间我们来梳理整个流程。
二、实际演练
1,定义一个索引mapping,并指定类型为float.单精度浮点型
- PUT nginxindex
- {
- "mappings": {
- "properties": {
- "price":{
- "type": "float"
- }
- }
- }
- }
2,写入几个文档,看看效果
- POST nginxindex/_doc
- {
- "price":4.68 //数字类型
- }
-
- POST nginxindex/_doc
- {
- "price": "4.69" //字符串类型
- }
-
- POST nginxindex/_doc
- {
- "price": "free for charge" //字符串类型
- }
-
3,对比结果
第一个,正常写入,有返回,
第二个,正常写入,有返回,
第三个,无法写入,报错提示。提示如下图所示
1,先创建一个目标索引,指定mapping参数
- PUT nginxnewindex2
- {
- "mappings": {
- "properties": {
- "price":{
- "type": "float",
- "coerce": false
- }
- }
- }
- }
2, 执行reindex拷贝,这里有问题,注意
- POST _reindex
- {
- "source": {
- "index": "nginxindex"
- },
- "dest": {
- "index": "nginxnewindex2"
- }
- }
返回报错如下:
那么至此,彻底解决客户这个问题。问题整理完毕。以后两个字段类型不一样需要转格式,大家也可以这么操作。
七、总结
本文从一个实际生产案列出发,分析剖解解决了一个字段精确值的问题,以及平滑解决存量索引字段类型转换的问题,因该方法比较经典,特梳理整理了一下,希望能帮到有需求的人们。
完。