背景: ES上的原数据接口某字段需要修改类型和配置分词器,但ES不支持修改已存在字段的类型,所以只能重新创建数据结构,且已存在数据不能丢失。
方法:创建新的索引,并创建新的数据结构,将老索引的数据全部迁移到新索引上,然后将给新索引创建别名,别名为老索引,删除老索引,这样线上请求老索引时会映射请求到新索引,使用者感觉不到变化。
1.创建新索引
put 127.0.0.1:9200/newIndex
{
"mappings": {
"newIndex": {
"properties": {
"businessId": {
"type": "long"
},
"content": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
},
"analyzer":"ik_max_word"
}
}
}
}
}
2.迁移数据到新索引
post 127.0.0.1:9200/_reindex
{
"source": {
"index": "oldIndex"
},
"dest": {
"index": "newIndex"
}
}
3.创建别名
post 127.0.0.1:9200/_aliases
{
"actions": [
{
"add" : {
"index": "newIndex",
"alias": "oldIndex"
}
}
]
}
4.删除原索引
delete 127.0.0.1:9200/oldIndex
这样就完成了数据结构的修改,虽然ES里的实际索引名换了,但是请求代码不用更改。