Elasticsearch Reindex 技能用于指导 Elasticsearch 的重建索引(reindex)操作,帮助用户以高性能方式把文档从源索引或数据流复制到目标索引。它通过 POST /_reindex 完成复制,并强调一套专家级工作流:显式准备目标、选择本地或远程执行、在源端按需过滤、将长任务异步运行、跟踪任务直至完成,并在报告结果前验证目标文档数量。
用途 该技能适用于复制或迁移索引、修改映射、按条件复制文档子集等任务。它明确建议:当任务只是筛选子集复制或直接的文档迁移时,不要使用 _split、_shrink 或快照/恢复,因为这些 API 解决的是不同问题。
主要能力
- 本地 reindex:源与目标在同一集群时,仅使用 source.index 和 dest.index。
- 远程 reindex:源与目标在不同集群时,添加 source.remote 及远程集群 URL 和凭据。远程 reindex 不支持切片,需通过基于查询的分区(日期范围、词条过滤)在并行请求中补偿。
- 源端过滤:通过 source.query 使用 Query DSL 只复制子集,例如按 @timestamp 的 range 过滤。
- 目标准备:_reindex 不会复制映射、分片数或分析器,需先用 PUT /{dest} 显式创建目标。
- 性能调优:source.size(批大小)、requests_per_second(限流)、本地 reindex 的 slices=auto(按主分片并行)、scroll、max_docs、script、dest.pipeline 等。
- 异步执行与任务跟踪:使用 wait_for_completion=false 立即返回任务 id,轮询 GET /_tasks/{task_id} 直至 completed 为 true,读取 status.total、status.created 和 response.failures。
- 中途限流调整:通过 POST /_reindex/{task_id}/_rethrottle?requests_per_second=N 在不取消任务的情况下调整限流。
- 结果验证:调用 GET /{dest}/_count 获取目标精确文档数,与源过滤预期比较,不得估算。
使用方式 该技能通过 elastic CLI 执行 Elasticsearch 操作。若未安装 elastic CLI,应告知用户其用途,不得猜测凭据、直接调用 HTTP API 或尝试其他变通方法。文档中的操作以 HTTP 简写形式引用(如 GET /、GET /_cat/indices、GET /{index}/_mapping、GET /{index}/_settings/index.mode、POST /_query),并映射到对应的 elastic CLI 命令,始终使用 CLI 而非直接调用 HTTP API。
典型流程
- 确认连通性与部署类型:调用 GET /,读取 build_flavor 和 version.number,判断分片、副本和集群设置 API 是否可用。集群不可达时停止,不猜测端点或凭据。
- 决定本地还是远程 reindex:比较源与目标所在位置。
- 检查源:调用 GET /{source}/_mapping 确认字段名与类型,调用 GET /{source}/_count 了解文档数量,绝不猜测。
- 准备目标索引:根据源映射创建目标,设置显式设置与映射。
- 构建并提交 reindex 请求:对可能超过几秒或用户称索引很大的复制,使用 POST /_reindex?wait_for_completion=false。
- 跟踪任务至完成:保存任务 id,轮询 GET /_tasks/{task_id}。
- 验证并报告目标文档数:调用 GET /{dest}/_count,报告目标精确数量。
- 成功全量复制后,用 PUT /{dest}/_settings 恢复目标的生产设置。
适用场景
- 将日志索引复制到具有修正映射的新索引。
- 并行重建大型索引并限流。
- 仅迁移近期文档(按时间范围过滤源)。
- 跨集群迁移数据。
- 修改映射、合并、使用 ingest pipeline 等。
限制与部署约束
- 本地 reindex:Self-Managed / ECH 与 Serverless 均完全支持。
- 远程 reindex:Self-Managed / ECH 完全支持;Serverless 为技术预览,仅支持 ECH 远程。
- number_of_shards/replicas:Self-Managed / ECH 用户可配置;Serverless 由 Elastic 管理,创建索引时省略。
- slices=auto(仅本地):两者均支持本地 reindex。
- GET /_cat/count/{index}:Self-Managed / ECH 支持;Serverless 不可用,改用 GET /{index}/_count。
- GET /_tasks(列出/取消):Self-Managed / ECH 完整支持;Serverless 仅能按任务 id 获取。
- PUT /_cluster/settings:Self-Managed / ECH 支持;Serverless 被阻止。
- _split / _shrink:Self-Managed / ECH 支持;Serverless 不可用。
其他注意事项
- 在 Self-Managed / ECH 上,复制期间在目标设置 number_of_replicas: 0 和 refresh_interval: "-1" 以提升写入吞吐,之后用 PUT /{dest}/_settings 恢复生产值;Serverless 上这些由 Elastic 管理,可设置 refresh_interval: "-1"。
- 对于数据流目标:确保存在带 data_stream: {} 的索引模板,创建数据流,并将 dest.op_type 设为 "create"(仅追加)。
- 优先考虑替代方案:运行时字段(修复字段类型不匹配或添加计算字段而无需 reindex)、别名(透明重定向查询,结合 reindex 实现零停机映射变更)、快照与恢复(Self-Managed / ECH,无需转换时更快地整索引传输)。
- 重试部分完成的 reindex 时使用 conflicts: "proceed"。
- 远程主机需在 Self-Managed / ECH 上加入允许列表(集群配置中的 reindex.remote.whitelist);Serverless 内部管理允许列表(仅 ECH 远程,技术预览)。