elasticsearch重建索引

ES对于已存在的索引字段无法修改,如果要修改索引结构,可以通过新建一个修改结构后的新索引,然后将旧索引中的数据复制到新索引中,变相实现修改索引。

配合索引别名可以实现无缝修改索引结构。

1
PUT /my_index_v1/_alias/my_index

示例:将testindex索引下的数据复制到testindex2索引下。默认配置下,对于type和id相同的文档直接覆盖处理。

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

version_type

可以指定参数version_typeexternal

  1. 当源索引文档不存在于目标索引,创建文档
  2. 当源索引文档存在于目标索引且源索引文档版本高于目标索引文档,更新文档
  3. 当源索引文档存在于目标索引且源索引文档版本等于或低于目标索引文档,该文档冲突不更新

当参数version_typeinternal(默认)时,源索引所有文档创建覆盖。

1
2
3
4
5
6
7
8
9
10
POST /_reindex
{
"source": {
"index": "testindex"
},
"dest": {
"index": "testindex2",
"version_type": "external | internal"
}
}

op_type

当指定参数op_typecreate时,_reindex操作只会将目标索引中不存在的文档创建过去,而目标索引中已存在的文档无论版本高低,文档冲突不更新。

1
2
3
4
5
6
7
8
9
10
POST /_reindex
{
"source": {
"index": "testindex"
},
"dest": {
"index": "testindex2",
"op_type": "create"
}
}

query

_reindex操作可以增加查询和type限制文档的数量,也可以从多个索引下复制文档到指定索引。

1
2
3
4
5
6
7
8
9
10
11
12
13
POST /_reindex
{
"source": {
"index": ["testindex"],
"type": ["testtype"],
"query": {
"match_all": {}
}
},
"dest": {
"index": "testindex2"
}
}

sort

_reindex支持选择性复制指定的文档数量和排序。

1
2
3
4
5
6
7
8
9
10
11
12
13
POST /_reindex
{
"size": 10,
"source": {
"index": "testindex",
"sort": {
"name": "asc"
}
},
"dest": {
"index": "testindex2"
}
}

script

_reindex支持使用脚本修改文档。

1
2
3
4
5
6
7
8
9
10
11
12
POST /_reindex
{
"source": {
"index": "testindex"
},
"dest": {
"index": "testindex2"
},
"script": {
"inline": "ctx._source.name = ctx._source.name + 'v2'"
}
}
>