You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Elasticsearch如何对超1万份文档执行Reindex实现全量无丢失迁移

问题原因

你请求中source.size = 10000定义的是reindex单次scroll请求拉取的批次大小,并不是迁移的总文档数上限。仅迁移1万份文档的核心原因是默认的scroll上下文有效期过短,拉取完第一批数据后上下文失效,无法继续拉取剩余文档。

你配置的version_type=external会保留原文档的版本号,即使已经迁移过部分文档,重新执行全量reindex请求只会补传未迁移的文档,不会造成重复写入或数据覆盖,无需单独处理已迁移的1万条数据。

无丢失全量迁移方案
  • 步骤1:前置优化(可选,提升迁移效率)
    迁移前先调整新索引B的配置,降低迁移过程中的资源消耗,加快迁移速度:
PUT B/_settings
{
  "number_of_replicas": 0,
  "refresh_interval": -1
}
  • 步骤2:执行后台reindex任务
    使用如下请求发起迁移,wait_for_completion=false会让任务在后台执行,避免前端连接超时中断,scroll=30m将scroll上下文有效期设为30分钟,足够覆盖2.6万文档的迁移周期:
POST _reindex?wait_for_completion=false&scroll=30m
{
  "source": {
    "index": "A",
    "size": 10000
  },
  "dest": {
    "index": "B",
    "version_type": "external"
  }
}

请求返回后会拿到任务ID,格式类似{"task": "节点ID:任务编号"}。
如果你的索引A分片数大于1,可以加sliced切片配置实现并行迁移,进一步提升速度,slice的max值和索引A的分片数保持一致即可:

POST _reindex?wait_for_completion=false&scroll=30m
{
  "source": {
    "index": "A",
    "size": 10000,
    "slice": {
      "id": 0,
      "max": 3
    }
  },
  "dest": {
    "index": "B",
    "version_type": "external"
  }
}
  • 步骤3:监控迁移进度
    可以通过任务ID查询迁移进度:
GET _tasks/<替换为你拿到的任务ID>

也可以直接对比两个索引的文档总量,确认迁移是否完整:

GET A/_count
GET B/_count
  • 步骤4:恢复新索引配置
    确认两个索引文档数量完全一致后,把索引B的配置恢复为业务需要的参数:
PUT B/_settings
{
  "number_of_replicas": 1,
  "refresh_interval": "1s"
}

后续如果需要切流,直接把业务访问的别名切换到索引B即可完成字段类型的平滑变更。

内容的提问来源于stack exchange,提问作者user404

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 17:24:03