elasticsearch5.5.2不停服务重建myindex
业务场景说明
已存在索引myindex(类型为mytype),由于业务需要修改字段类型,或需要指定中文分词器ik_max_word;但由于es已存在字段不允许修改索引mapping结构,只能重建索引;灵活使用reindex和aliases,达到不停服务重建索引目的。
本次重建mapping操作步骤
郑重声明:养成好习惯,操作之前先备份好myindex数据
$ curl -X POST 'http://localhost:9200/_reindex?slices=5&refresh&wait_for_completion=false' -d '
{
"conflicts": "proceed",
"source":{
"index":"myindex",
"query": {
"match_all": {}
},
"size": 1000
},
"dest":{
"index":"myindex_bak"
}
}
'
# slices=5 : 拆分为5个任务,视机器的CPU等资源而定,也可以不用这个参数
# wait_for_completion=false : 异步任务处理,不用等待结果返回,可以通过命令_tasks查看任务执行情况
查询当前所有reindex任务,进行找到当前任务id
$ curl -X GET 'http://localhost:9200?_tasks?detailed=true&actions=*reindex'
查看当前任务
$ curl -X GET 'http://localhost:9200/_tasks/taskId:9620804'
1、按最新结构创建好myindex_v1
说明:如果设置默认模板(_template/rtf)为中文分词器,不需要特意创建结构指定中文分词器,直接reindex即可
$ curl -X PUT 'http://localhost:9200/myindex_v1' -d '
#...此处省略mapping结构,如下面结构
{
“mappings”:{
"mytype":{
"properties":{
"name":{
"type":"keyword"
}
}
}
}
}
'
# 可以通过_mapping查看myindex的mappings结构,根据结构修改即可
$ curl -X GET 'http://localhost:9200/myindex/_mapping'
2、从myindex重建索引到myindex_v1
注意:当前步骤操作完后,查看node状态及数据条数、任务响应中是否有失败消息,保证数据正确才进行下一步操作
$ curl -X POST 'http://localhost:9200/_reindex?slices=5&refresh&wait_for_completion=false' -d '
{
"conflicts": "proceed",
"source":{
"index":"myindex",
"query": {
"match_all": {}
},
"size": 1000
},
"dest":{
"index":"myindex_v1"
}
}
'
3、删除myindex
$ curl -X DELETE 'http://localhost:9200/myindex'
4、创建myindex_v1的同义词为myindex
$ curl -X POST 'http://localhost:9200/_aliases' -d '
{
"actions": [
{ "add": {
"alias": "myindex",
"index": "myindex_v1"
}}
]
}
'
5、验证访问myindex数据
$ curl -X GET 'http://localhost:9200/myindex/mytype/_search'
下次重建myindex的mapping操作步骤
操作之前记得备份myindex数据呀。。。
1、按最新结构创建好myindex_v2
说明:如果设置默认模板(_template/rtf)为中文分词器,不需要特意创建结构指定中文分词器,直接reindex即可
$ curl -X PUT 'http://localhost:9200/myindex_v2' -d '
#...此处省略mapping结构,如下面结构
{
“mappings”:{
"mytype":{
"properties":{
"name":{
"type":"keyword"
}
}
}
}
}
'
# 可以通过_mapping查看myindex的mappings结构,根据结构修改即可
$ curl -X GET 'http://localhost:9200/myindex/_mapping'
2、从myindex_v1重建索引到myindex_v2
注意:当前步骤操作完后,查看node状态及数据条数、任务响应中是否有失败消息,保证数据正确才进行下一步操作
$ curl -X POST 'http://localhost:9200/_reindex?slices=5&refresh&wait_for_completion=false' -d '
{
"conflicts": "proceed",
"source":{
"index":"myindex_v1",
"query": {
"match_all": {}
},
"size": 1000
},
"dest":{
"index":"myindex_v2"
}
}
3、修改同义词。将myindex指向myindex_v1的同义词,修改为myindex指向myindex_v2
curl -X POST localhost:9200/_aliases -d '
{
"actions": [
{ "remove": {
"alias": "myindex",
"index": "myindex_v1"
}},
{ "add": {
"alias": "myindex",
"index": "myindex_v2"
}}
]
}
'
4、删除myindex_v1
$ curl -X DELETE 'http://localhost:9200/myindex_v1'
5、验证访问myindex数据
$ curl -X GET 'http://localhost:9200/myindex/mytype/_search'
其他:设置es默认模板,指定索引text字段都为ik_max_word分词器
注: 设置模板,需要重新导入数据,才生效 即:新增的index或reindex才会使用默认模板
1.获取全局默认分词器
curl -X GET 'http://localhost:9200/_template/rtf'
2.删除默认模板
curl -X DELETE 'http://localhost:9200/_template/rtf'
3.设置全局默认分词器
curl -X PUT 'http://localhost:9200/_template/rtf'
-d'
{
"template": "*",
"settings": { "number_of_shards": 1 },
"mappings": {
"_default_": {
"_all": {
"enabled": true
},
"dynamic_templates": [
{
"strings": {
"match_mapping_type": "string",
"mapping": {
"type": "text",
"analyzer":"ik_max_word",
"search_analyzer":"ik_max_word",
"ignore_above": 102400,
"fields": {
"keyword": {
"ignore_above": 256,
"type": "keyword"
}
}
}
}
}
]
}
}
}
'