Elasticsearch _reindex使用

- 环境

  • Elasticsearch 7.10.0
  • Elasticsearch _reindex文档地址 文档
1
在Elasticsearch中,_reindex是一个API,用于将一个索引中的数据重新索引到另一个索引中。这通常用于数据的迁移、重建索引结构或者对数据进行某种转换。_reindex可以复制现有索引中的文档,并将它们插入到新的索引中。

_reindex的基础操作以一些关键点和注意事项:

1
API用法:你可以使用_reindex API来执行重新索引操作。例如,使用POST请求到/_reindex端点,并在请求体中包含源索引和目标索引的定义。
1
2
3
4
5
6
7
8
9
POST /_reindex
{
"source": {
"index": "source_index_name"
},
"dest": {
"index": "destination_index_name"
}
}
  • 版本冲突:如果在重新索引过程中发生版本冲突(即文档在两个索引中都有并且版本不同),你可以通过version_type参数来指定如何处理这些冲突。默认情况下,version_type设置为internal,这意味着新文档将覆盖旧文档。如果你希望保留冲突文档,可以将其设置为external。

  • 映射和设置:需要注意的是,_reindex只会复制文档的内容,而不会复制源索引的映射(mapping)和设置(settings)。这意味着你需要确保目标索引的映射和设置与你的需求相匹配。

  • 性能考虑:重新索引可能是一个资源密集型的操作,特别是当处理大量数据时。你应该考虑在低流量时段执行此操作,并监控集群的性能和资源使用情况。

  • 别名和索引管理:在重新索引完成后,你可能需要更新索引别名,以确保查询和应用程序继续指向正确的索引。此外,你还需要管理旧索引的生命周期,例如将其标记为只读或完全删除。

  • 总之,_reindex是Elasticsearch中一个强大的工具,用于在索引之间迁移和转换数据。然而,由于它可能涉及复杂的操作和性能考虑,因此在使用时应谨慎行事,并确保理解其工作原理和潜在影响。

_reindex的特殊处理和示例:

示例1:当字段名错误时,使用index将数据写入新表,使修正错误的字段名

创建错误索引index_old,其中name字段误写为neme。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
PUT index_old
{
"settings": {
"number_of_shards": 6,
"number_of_replicas": 0
},
"mappings": {
"dynamic": "strict",
"properties": {
"neme": {
"type": "keyword"
},
"age":{
"type": "integer"
}
}
}
}

index_old写入两条数据

1
2
3
4
5
6
7
8
9
10
POST 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
18
PUT 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
2
3
4
5
6
7
8
9
10
11
12
POST _reindex
{
"source": {
"index": "index_old"
},
"dest": {
"index": "index_new"
},
"script": {
"source": "ctx._source.name = ctx._source.remove(\"neme\")"
}
}

说明:上述示例展示了当字段名错误时,如何使用_reindex API和script来修正字段名,并将数据从旧索引迁移到新索引。在脚本中,我们通过ctx._source.name = ctx._source.remove(“neme”)来将neme字段的值赋给name字段,并从_source中移除neme字段。这样,我们就可以在新索引中正确地使用name字段了。


Elasticsearch _reindex使用
https://flyfishs.top/2024/04/29/Elasticsearch _reindex使用/
作者
飞鱼
发布于
2024年4月29日
许可协议