修改已经存在了的ES数据结构
问题背景:
由于ElasticSearch没有像mysql一样可以直接字段数据类型的方法,因此需要通过创建中间索引:data_index_1,备份数据到中间索引:data_index_1,然后删除原索引: data_index,重新创建正确数据类型索引:data_index,再把中间索引:data_index_1的数据备份到新创建索引:data_index。语句通过kibana的 dev_tools/console 执行。
解决步骤:
1,创建一个中间索引
-- 字段类型同源索引
PUT /publish_process_bak
{
"mappings": {
"properties": {
"dbEntityId": {
"type": "long"
},
"esEntityId": {
"type": "keyword"
},
"publishDatetime": {
"type": "date",
"format": "date_optional_time||epoch_millis"
},
"publishPeople": {
"type": "keyword"
}
}
}
}
2,向中间索引备份源索引的数据
POST _reindex
{
"source": {
"index": "publish_process"
},
"dest": {
"index": "publish_process_bak"
}
}
3,查询确认数据是否copy过去
GET publish_process_bak/_search
4,删除原来有问题的索引
DELETE publish_process
5,重新创建同名的索引(字段类型修改正确)
-- 字段类型同源索引
PUT /publish_process
{
"mappings": {
"properties": {
"dbEntityId": {
"type": "long"
},
"esEntityId": {
"type": "text"
},
"publishDatetime": {
"type": "date",
"format": "date_optional_time||epoch_millis"
},
"publishPeople": {
"type": "text"
}
}
}
}
6,从中间索引还原到源索引的数据
POST _reindex
{
"source": {
"index": "publish_process_bak"
},
"dest": {
"index": "publish_process"
}
}
7,查询确认数据是否copy过去
GET publish_process/_search
GET publish_process/_mapping
8,删除中间索引
DELETE publish_process_bak
最后数据结构修改完成。
注意:如果数据量特别大,这种方式不知道是否合适,请慎重考虑。