_reindex 是什么
_reindex 把源索引的数据复制到目标索引,常用于映射调整、分片数变更、索引结构升级与跨集群迁移。它支持脚本改写文档、切片并行与冲突处理,且不会删除源索引。典型流程是:先建好目标索引,再迁移数据,核对文档数,切换别名,最后清理旧索引。
基本信息
| 接口 | POST /_reindex |
|---|---|
| 常用参数 | slices=auto、wait_for_completion=false、requests_per_second、scroll |
| 冲突处理 | conflicts=proceed 跳过冲突,默认 abort |
| 写入模式 | dest.op_type:index 覆盖、create 遇已存在则冲突 |
| 远程源 | source.remote 可指向另一集群 |
| 任务跟踪 | 异步执行后用 GET /_tasks/<taskId> 查看进度 |
典型使用场景
- 字段类型定义错误后重建索引并搬迁数据
- 主分片数调整(重建到新索引,不支持原地改分片数)
- 索引拆分或合并:按时间拆成多个索引或反向合并
- 跨集群搬迁:把历史数据迁到新集群
- 用脚本在迁移过程中顺手改字段结构或补默认值
- 清理前先迁移有效数据,实现「新索引替换旧索引」的平滑切换
示例
示例
POST /_reindex?slices=auto&wait_for_completion=false # 异步并行迁移
{
"source": {
"index": "old-index",
"size": 1000, # 每批读取文档数
"query": { "range": { "ts": { "gte": "2026-01-01" } } } # 只迁需要的范围
},
"dest": { "index": "new-index", "op_type": "create" }
}
GET /_tasks/<taskId> # 查看进度
GET /new-index/_count # 与源索引核对数量关键参数读法
| 参数 | 作用 | 注意点 |
|---|---|---|
| slices | 并行切片数 | auto 按分片数决定 |
| wait_for_completion | 是否同步等待 | 大数据量用 false 异步 |
| op_type=create | 仅新增不覆盖 | 保留并发写入的历史版本 |
| conflicts=proceed | 遇冲突继续 | 否则整任务中断 |
| requests_per_second | 限速 | 避免压垮在线集群 |
迁移前先把目标索引的映射建好;迁移完成后核对 _count 与源索引一致,再切换别名并删除旧索引。
reindex 只处理执行那一刻已有数据,迁移期间的新写入不会自动同步,需要双写或按别名切换方案兜住增量。
映射类型不兼容时目标侧会写入失败:先把目标映射调成能容纳源数据的类型,或用 script 做转换后再写入。