es删除字段

img

修行者12138关注

2020.12.14 20:53:55字数 432阅读 8,123

原索引mappings如下,有full_name和short_name两个字段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"audit_demo": {
"mappings": {
"_doc": {
"properties": {
"full_name": {
"type": "text",
"analyzer": "ik_max_word"
},
"short_name": {
"type": "keyword"
}
}
}
}
}
}

想要删掉short_name字段,修改后mappings如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"audit_demo_bak": {
"mappings": {
"_doc": {
"properties": {
"full_name": {
"type": "text",
"analyzer": "ik_max_word"
}
}
}
}
}
}

步骤1 删除原索引中待删除字段的数据

注意
1.只是删除数据,不是删除字段
2.如果不删除字段数据,后面reindex时依然会把待删除字段的值带到新索引,即使设置新索引的dynamic为false

1
2
3
4
5
6
7
8
9
10
POST {{di}}/audit_demo/_update_by_query
{
"script": {
"lang": "painless",
"inline": "ctx._source.remove(\"short_name\")"
},
"query": {
"match_all": {}
}
}

步骤2 新建一个索引,索引结构在原索引上删除short_name字段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
PUT {{di}}/audit_demo_bak
{
"settings": {
"number_of_shards": "2",
"number_of_replicas": "2",
"max_result_window": 100000,
"analysis": {
"analyzer": {
"ik": {
"tokenizer": "ik_max_word"
}
}
}
},
"mappings": {
"_doc": {
"properties": {
"full_name": {
"type": "text",
"analyzer": "ik_max_word"
}
}
}
}
}

步骤3 同步数据

1
2
3
4
5
6
7
8
9
POST {{di}}/_reindex
{
"source": {
"index": "audit_demo"
},
"dest": {
"index": "audit_demo_bak"
}
}

步骤4 删除原索引

1
DELETE {{di}}/audit_demo

步骤5 新建一个名为原索引名的索引,reindex同步数据,然后删除步骤2新建的索引

注意事项

步骤4和步骤5,这两个步骤,耗时较长,在这段时间,索引是不可用的,一般在业务低峰期执行操作没啥问题。如果想要减少索引不可用的时间,有以下两个方案

方案1
删除原索引后,为新索引设置别名为原索引
备注:原索引未删除时,为新索引设置别名为原索引会报错

1
PUT {{di}}/audit_demo_bak/_alias/audit_demo

方案2
步骤1开始之前,就为原索引设置别名,应用程序通过别名访问索引,步骤4开始之前,删除原索引与别名的关系,新增新索引与别名的关系,应用程序通过别名可以访问到新索引。
虽然这两个步骤的耗时极小,但是还是有可能在这段期间有数据更改,所以还是尽量在业务低峰期操作。