Elasticsearch _reindex使用
- 环境
- Elasticsearch 7.10.0
- Elasticsearch _reindex文档地址 文档。
1 |
|
_reindex的基础操作以一些关键点和注意事项:
1 |
|
1 |
|
版本冲突:如果在重新索引过程中发生版本冲突(即文档在两个索引中都有并且版本不同),你可以通过version_type参数来指定如何处理这些冲突。默认情况下,version_type设置为internal,这意味着新文档将覆盖旧文档。如果你希望保留冲突文档,可以将其设置为external。
映射和设置:需要注意的是,_reindex只会复制文档的内容,而不会复制源索引的映射(mapping)和设置(settings)。这意味着你需要确保目标索引的映射和设置与你的需求相匹配。
性能考虑:重新索引可能是一个资源密集型的操作,特别是当处理大量数据时。你应该考虑在低流量时段执行此操作,并监控集群的性能和资源使用情况。
别名和索引管理:在重新索引完成后,你可能需要更新索引别名,以确保查询和应用程序继续指向正确的索引。此外,你还需要管理旧索引的生命周期,例如将其标记为只读或完全删除。
总之,_reindex是Elasticsearch中一个强大的工具,用于在索引之间迁移和转换数据。然而,由于它可能涉及复杂的操作和性能考虑,因此在使用时应谨慎行事,并确保理解其工作原理和潜在影响。
_reindex的特殊处理和示例:
示例1:当字段名错误时,使用index将数据写入新表,使修正错误的字段名
创建错误索引index_old,其中name字段误写为neme。
1 |
|
index_old写入两条数据
1
2
3
4
5
6
7
8
9
10POST index_old/_doc/id_1
{
"neme":"张三",
"age":"20"
}
POST index_old/_doc/id_2
{
"neme":"李四",
"age":"25"
}
创建新索引index_new,修正name字段。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18PUT index_new
{
"settings": {
"number_of_shards": 6,
"number_of_replicas": 0
},
"mappings": {
"dynamic": "strict",
"properties": {
"name": {
"type": "keyword"
},
"age":{
"type": "integer"
}
}
}
}
正常情况映射不同会导致报错,因为name和neme有冲突,使用script进行字段转换.
1 |
|
说明:上述示例展示了当字段名错误时,如何使用_reindex API和script来修正字段名,并将数据从旧索引迁移到新索引。在脚本中,我们通过ctx._source.name = ctx._source.remove(“neme”)来将neme字段的值赋给name字段,并从_source中移除neme字段。这样,我们就可以在新索引中正确地使用name字段了。