首页/数据/NoSQL 速查/_reindex 重建索引与数据迁移
Elasticsearch89 条

_reindex 重建索引与数据迁移

reindex 把源索引数据复制到目标索引,常用于映射调整、分片数变更与跨集群迁移;支持脚本改写文档、切片并行与冲突处理。

NoSQL 速查数据更新于 2026-10-13

_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 做转换后再写入。

易错点

  • op_type 用 index 会覆盖同名文档,需要保留历史版本时用 create 并处理冲突
  • reindex 不同步增量写入,切换别名前必须确认增量方案,否则会丢新数据
  • 切片数过大(如 slices 设成几百)会让源集群负载飙升,按数据量与节点数适量设置
  • 同步等待大数据量迁移容易超时中断,长任务应异步执行并用 _tasks 跟踪
  • 迁移结束不核对文档数就直接删除旧索引,可能丢失未迁移成功的数据

数据来源与参考

  • Elasticsearch Guide: Reindex API
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌