Elasticsearch 的 Reindex API 是一个强大的工具,用于将文档从一个源索引复制到另一个目标索引。它不仅可以用于简单的数据迁移,还可以在重新索引的过程中修改文档内容、过滤文档、并行化处理,甚至从远程集群重新索引数据。以下是 Reindex API 的详细功能和使用场景总结:
---
Elasticsearch Reindex API 详解
1\.基本功能
1.1 从一个索引复制到另一个索引
Reindex API 的核心功能是将文档从一个源索引复制到目标索引。源可以是任何现有的索引、别名或数据流,而目标必须与源不同。例如:
```http
POST _reindex
{
"source": {
"index": "my-old-index"
},
"dest": {
"index": "my-new-index"
}
}
```
1.2 支持从多个源索引复制
你可以通过在`source`中指定多个索引,一次性从多个源索引中复制文档:
```http
POST _reindex
{
"source": {
"index": ["my-old-index-1", "my-old-index-2"]
},
"dest": {
"index": "my-new-index"
}
}
```
1.3 支持数据流(Data Streams)
Reindex API 还支持将文档重新索引到数据流中。如果目标是数据流,`op_type`必须设置为`create`,以确保只添加新文档,而不会更新已存在的文档。
---
2\.高级功能
2.1 使用查询过滤文档
你可以通过在`source`中添加查询,仅重新索引满足条件的文档。例如,仅复制`user.id`为`kimchy`的文档:
```http
POST _reindex
{
"source": {
"index": "my-old-index",
"query": {
"term": {
"user.id": "kimchy"
}
}
},
"dest": {
"index": "my-new-index"
}
}
```
2.2 使用脚本修改文档
Reindex API 支持在重新索引过程中通过脚本修改文档内容。例如,你可以重命名字段或删除字段:
```http
POST _reindex
{
"source": {
"index": "my-old-index"
},
"dest": {
"index": "my-new-index"
},
"script": {
"source": "ctx._source.new_field = ctx._source.remove('old_field')"
}
}
```
2.3 并行化处理(Sliced Scroll)