写点什么

ES 索引 mpping 字段数据类型更改过程

用户头像
Lin
关注
发布于: 刚刚
ES索引mpping字段数据类型更改过程

更改背景

存在 field 类型设置错误,导致文档无法写入。比如:String 类型的数据,但是 field 的字段却是 integer。

修改方案

ES 在索引创建后,不能直接修改 mapping 中 field 的类型设置。这就造成一旦 field 类型设置错误。可能导致整个索引无法使用。因此,索引的建立,字段的添加,一定要经过严格的评审 ,测试环境测试通过,再往生产环境迁移。修改起来将会比较曲折:

  1. 新建不同名称的正确索引,使用 es 的 _reindex API 将数据复制到新索引,并确定数据一致

  2. 把旧索引删掉,重建与旧索引名称相同,正确配置的空索引。(注意:需要保证数据停写、ES 不动态创建索引

  3. 使用_reindex API 操作将第<1>步新建的索引中备份数据写回到步骤<2>中重建的索引中。

注意:整个过程一定要做到数据停写,并将 ES 的动态创建索引开关关掉

⚠️注意事项

整个操作过程中,如果数据不停写,动态索引创建正好又在开着。会导致以下问题产生

  1. 执行步骤<1>时:新数据会继续往旧索引中写入,造成备份的数据很难保证一致性。

  2. 执行步骤<2>时:刚删完旧索引,由于数据写入操作,es 自己动态创建索引,此时它自动添加的索引大概率不是你想要的设定类型,导致你在重建时,直接报索引已存在。而数据又已经写入到它所创建的索引中,想要再复制到你指定的索引中,大概率又会出现类型检查错误。阻碍整个过程执行。

  3. 倘若操作者又在一种比较着急的问题修正场景,很容易由于紧张加上错误判断出现数据无法挽回的翻车。后果很可能很严重。

执行操作示例

索引创建

PUT "localhost:9200/test_index{  "settings": {    "number_of_shards": 24  },  "mappings": {    "test_mapping": {      "properties": {        "code": {          "type": "keyword"        }      }    }  }}
复制代码

索引数据复制

注意:数据复制时,根据执行步骤调整 source 和 dest 的索引名称

POST _reindex{	"source":{  	"index":"test_index"  }  "dest":{  	"index":"test_index_new"  }}
复制代码


发布于: 刚刚阅读数: 3
用户头像

Lin

关注

文字,是一种表达方式 2017.12.22 加入

软件开发工程师

评论

发布
暂无评论
ES索引mpping字段数据类型更改过程