一、需求
当es字段类型无法支撑业务需求,需要修改到字段类型的时候。例如修改字段类型从Integer变成double,这种情况下,是没办法修改es的字段的type的。
原因是一个字段的类型进行修改之后,ES会重新建立对这个字段的索引信息,ElasticsSearch的底层是Lucene库,字段类型修改会涉及到分词方式,相关度,TF/IDF等倒排的生成 , 所以是没办法修改的了。
这种情况下,如何能兼容旧数据的同时,实现修改字段类型?
二、如何实现:es的reindex
实现原理:通过es的reindex功能把旧索引的数据reindex到新索引,然后为新索引建立旧索引的别名,最后删除旧索引。
下面以重构:idt-shelf-2265-index-202003 下的 shelf_sub_job 中的Integer字段变为double为例子
- 新建一个索引:idt-shelf-2265-index-202003-temp (注:该索引下的数据表type和原索引保持一致。其中,新索引中的字段属性已修改为double)
*可通过EsIndexService类创建一个新的索引。
- 执行reindex操作,把旧索引的数据复制到新索引:
POST _reindex { "source": { "index": "idt-shelf-2265-index-202003" }, "dest": { "index": "idt-shelf-2265-inde