目录
1、需求场景:
2、实现思路:
3、实现步骤:
(1)创建索引:
(2)创建索引同义词(别名):
A、不需要过滤数据同义词(别名):
B、需要过滤数据同义词(别名):
(3)创建新索引:
(4)新旧索引数据迁移:
A、完整迁移数据:
B、字段重命名迁移数据:
C、字段值调换迁移数据:
(5)修改索引同义词(别名):
(6)删除旧索引:
1、需求场景:
Elasticsearch的mapping一旦创建,只能增加字段,而不能修改已经mapping的字段。但现实需求往往并非如此,有时需要修改已经定义好的字段名称、字段类型等。
2、实现思路:
这里有一个方法修改mapping,那就是重新建立一个index,然后创建一个新的mapping,再将旧的index中的数据迁移到新的index中去,最后将索引同义词指向新的index即可。你可能会问,这要是在生产环境,可行吗?答案是,如果你一开始就采取了合适的设计——索引同义词,利用索引同义词完全是可以做到不停服务实现修改mapping平滑过渡的。
3、实现步骤:
(1)创建索引:
此索引为旧索引,模拟修改mapping平滑过渡时才需要创建此索引。项目正常使用时,此索引就是项目正在使用并且需要修改mapping的索引。
(2)创建索引同义词(别名):
A、不需要过滤数据同义词(别名):
http://192.168.99.164:9200/_aliases POST
{
"actions": [
{
"add": {
"index": "my_index",
"alias": "my_index_alias"
}
}
]
}
B、需要过滤数据同义词(别名):
对于同一个index,我们给不同人看到不同的数据,如my_index有个字段是team,team字段记录了该数据是那个team的,team之间的数据是不可见的。
http://192.168.99.164:9200/_aliases POST
{
"actions": [
{
"add": {
"index": "my_index",
"alias": "my_index__teamA_alias",
"filter":{
"term":{
"team":"teamA"
}
}
}
},
{
"add": {
"index": "my_index",
"alias": "my_index__teamB_alias",
"filter":{
"term":{
"team":"teamB"
}
}
}
},
{
"add": {
"index": "my_index",
"alias": "my_index__team_alias"
}
}
]
}
GET /my_index__teamA_alias/_search 只能看到teamA的数据
GET /my_index__teamB_alias/_search 只能看到teamB的数据
GET /my_index__team_alias/_search 既能看到teamA的,也能看到teamB的数据
(3)创建新索引:
获取旧索引的mapping,根据需求对旧mapping进行手动修改得到新mapping,然后通过命令执行新mapping创建新索引。
(4)新旧索引数据迁移:
A、完整迁移数据:
直接将全部数据完整迁移过去。
http://192.168.99.164:9200/_reindex POST
{
"source": {
"index": "twitter"
},
"dest": {
"index": "new_twitter"
}
}
B、字段重命名迁移数据:
把flag重命名为tag,迁移全部数据。
http://192.168.99.164:9200/_reindex POST
{
"source": {
"index": "test"
},
"dest": {
"index": "test2"
},
"script": {
"inline": "ctx._source.tag = ctx._source.remove(\"flag\")"
}
}
C、字段值调换迁移数据:
在数据录入时,字段yxdm和字段jwzydm数据位置错位了,现在需要将数据调换回来,迁移全部数据。
注意需要使用yxdm1作为中间变量存储交换的字段
http://192.168.99.164:9200/_reindex POST
{
"source": {
"index": "sugon_course_students_onduty_bak2017_05"
},
"dest": {
"index": "sugon_course_students_onduty_2017_05"
},
"script": {
"inline": "ctx._source.yxdm1 = ctx._source.remove(\"jwzydm\");ctx._source.jwzydm = ctx._source.remove(\"yxdm\");ctx._source.yxdm = ctx._source.remove(\"yxdm1\")"
}
}
(5)修改索引同义词(别名):
修改索引同义词(别名),就是先删除该索引同义词,然后创建新的索引同义词,两个步骤在一个命令中执行。这样就可以实现平滑过渡。
http://192.168.99.164:9200/_aliases POST
{
"actions": [
{ "remove": {
"alias": "my_index",
"index": "my_index_v1"
}},
{ "add": {
"alias": "my_index",
"index": "my_index_v2"
}}
]
}
(6)删除旧索引:
修改好索引同义词后,程序访问的便是新索引中的数据了,如果程序访问新索引正常,就可以将旧索引删除了,如果为了安全起见,也可以将旧索引备份一下再删除旧索引。