Elasticsearch的reindex API是如何运作并应用其原理的?

2026-05-30 13:546阅读0评论服务器VPS
  • 内容介绍
  • 文章标签
  • 相关推荐

当你在夜深人静的服务器机房里 灯光闪烁,键盘敲击声回荡在墙壁间,你突然想要把一个旧索引的数据搬到一个全新的索引里——别着急,我知道这听起来像是搬家,但这其实是 Elasticsearch 的重建工作。今天我们就来聊聊它的重建 API:Reindex,不妨...。

1️⃣ 什么是 Reindex?

躺平... Reindex 并不是一个普通的复制命令, 它是一台巨大的搬运工车,能够把数据从一块地迁移到另一块地,一边还能在路途中对数据进行变形、过滤甚至重塑。你可以把它想象成一个“数据换房子”的服务——房子不变,土地可以重新规划。

Elasticsearch核心API之reindex API的应用及原理分析

1.1 我们为什么需要它?

当你的映射不再满足业务需求时 你不能简单地修改字段类型;如果你想调整分片数,却又不想等着整个集群停机, 何不... 那就得用 Reindex。还有跨集群迁移、批量删除老版本字段……一切都能靠它搞定。

1.2 语法小抄

POST _reindex {
  "source": {
    "index": "old-index",
    "query": { ... }
  },
  "dest": {
    "index": "new-index"
  }
}

嗨!这只是最简化的形式, 你可以加 slicesscriptbatchesize 等超多参数。每个参数都像是搬家时选配的工具箱,上手。。

2️⃣ 内部原理大揭秘

Aha!Reindex 可不是一次性完成,而是分段滚动+ 批量写入两步走。先用 Scroll 把源索引读出来再用 Bulk 把数据写进目标索引。 也是醉了... 下面让我们拆解一下关键组件:

2.1 DelayedPrepareBulkRequest:延迟调度的神秘武器

这个类负责把每个 Bulk 请求延迟施行,以实现节流控制。 引起舒适。 当请求速率太快时它会延迟时间,让集群喘口气。


class DelayedPrepareBulkRequest {
    private final ThreadPool threadPool;
    private final Runnable command;
    private final float requestsPerSecond;
    private final ScheduledFuture scheduled;
    ...
}

噢, 对了如果你想慢慢来可以把 requests_per_second 调到很低值, 累并充实着。 然后看着日志慢慢滚动——这种感受,比喝杯咖啡还温柔。

2.2 Sliced Scroll:并行切片,让速度翻倍!

得了吧... Sliced scroll 是 Reindex 的核心并行化技术。你只需给出 slices.max=5, 系统就会自动把任务拆成五份,每份跑在不同线程上。


POST _reindex{
  "source":{"slice":{"id":0,"max":5}},
  "dest":{"index""}
}
...
POST _reindex{
  "source":{"slice":{"id":4,"max"}...}
}

2.3 验证与错误处理——不要被 Validation 拒绝!


public ActionRequestValidationException validate {
    if .indices == null || getSearchRequest.indices.length == 0) {
        return addValidationError;
    }
}

何不... N.B.: 如果源索引没有开启 _source 或者使用了 false, 那么整个请求会直接失败—这可别掉以轻心!而且如果你一边指定 remoteInfo 与 query 参数,就会抛出验证错误;记得分别使用哦~😅。

噪音提醒:

  • * 如果你想让 Reindex 在后台异步跑, 请加上 "wait_for_completion": false *.
  • * 当你设置 op_type 为 create 时只会创建缺失文档,已存在文档会导致版本冲突。
  • * 别忘了为目标索引提前配置 mapping,否则拷贝成功后可能出现字段类型不匹配的问题。
  • * 在远程集群迁移时 务必使用 RemoteInfo 的 query 参数,而不是 source.query。
  • * 每秒请求数默认 -1, 也就是无限制;如果担心系统压力,可自行设定 throttle 参数。
  • * 切片总数大于源索引文档数时 多余切片会空跑,这也算是一种资源浪费~ 😜

随机产品对比表格——谁更强?谁更懒?🤔️️️️️️️️️️️💡💡💡💡💡💡💡💡💡⚙⚙⚙⚙⚙⚙⚙⚙⚙🌟🌟🌟🌟🌟🌟🌠🌠🌠☀☀☀☀☀☀☀☀☀🍕🍕🍕🍔🍔🍔🍺🍺🍺🥤🥤🥤🛠🛠🛠🔧🔧🔧🔩🔩🔩📦📦📦🚚🚚🚚🗃🗃🗃🏭🏭🏭🛰🛰🛰⏰⏰⏰🏆🏆🏆🔥🔥🔥😎😎😎🎉🎉🎉✨✨✨✈✈✈🚀🚀🚀🙌🙌🙌➡➡➡⬇⬇⬇➡➡➡ ⬅⬅⬅ ➖➖➖ ➕➕➕ 💬💬💬 📝📝📝 🗣🗣🗣 📢📢📢 🎤🎤🎤 📞📞📞 🚨🚨🚨 🔥🔥🔥 ⚔⚔⚔ ☑☑☑ ❌❌❌ ⭕⭕⭕ ⚪⚪⚪ 🔵🔵🔵 🔴🔴🔴 ⚫⚫⚫ 🟢🟢🟢 🟣🟣🟣 🌈🌈🌈'
产品/特性/用途/价格/性能/好评率/适合人群/是否支持ReIndex功能/是否需要手动维护/推荐指数
Elasticsearch | 全功能搜索 | 高性能 | ★★★★☆ | ★★★★☆ | 大型企业级应用 | 支持         true  →  支持完整ReIndex流程与脚本转换功能 | 是 | ★★★★★| ⭐⭐⭐⭐| 高度可 | 极致稳定性| 完整支持跨集群迁移及Sliced Scroll并行化处理| ✅ 推荐给开发者和运维人员| 🌐 强力社区支持| 🎯 对大规模数据场景极佳 Solr | 搜索平台 | 中等性能 | ★★★☆☆ | ★★★☆☆ | 中型企业级应用 | 部分支持     false → 缺少内置重建API, 需要插件或手动脚本 | 是  | ★★★☆☆| ⭐⭐⭐| 可 但维护成本较高 Meilisearch | 快速全文搜索  | ★★☆☆☆ | ★★☆☆☆ | 小型团队或个人项目 | ❌ 不支持官方ReIndex操作,需要自行编写脚本或数据库导入导出工具;适用于快速原型和轻量级部署| ❓ 是否值得投入?仅在对实时搜索有高要求且不愿意投入大量运维资源时才推荐使用。
**嘿, 各位读者朋友们**:我知道这张表格看起来像是一张卡通表情包集合,但它确实告诉你哪个产品最适合做重建任务。Elasticsearch 用力冲锋, 是最常见也是最稳妥的选择;Solr 更注重传统检索,对高级用户友好;而 Meilisearch 那轻巧无忧,更像是在沙盒里玩游戏。不过说到底, 你要根据自己的业务规模和维护能力来挑选啊~ 💪😉

温馨提示:

  • - 如果你的业务只需有时候清洗旧数据,不必频繁运行 ReIndex,可以考虑先做备份再施行,以免误删重要内容。
  • - 当涉及版本冲突时 可设置 conflicts : proceed 来继续施行,但务必检查冲突原因是否合理,否则可能导致数据不一致。
  • - 对于大规模索引迁移, 可以先做小批量测试,以确认脚本转换和 mapping 是否符合预期,然后再正式跑完全部文档。

🐱‍👓 性能优化技巧大公开 🚂 🚂 🚂 🚂 🚂 🚂

① 调整 batch_size — “吞吐量”与“内存”之间的平衡点 ♻️♻️♻️♻️♻️♻️ ♻ ♻ ♻︎︎︎︎︎︎︎︎︎︎︎︎︎︎︎︱︱︱︱︱︱︱︱︱❄❄❄❄❄ ❄ ❄ ❄ ❄

text

注意过大的 batch_size 会导致单次 bulk 请求体过大, 占满网络带宽,还可能主要原因是单个请求时间过长触发超时。 我满足了。 所以找到“最佳”值往往需要实验,多尝试几个配置并监控 JVM GC 与 ES 节点 CPU 使用率。


② 利用 Script 做即时转换 🤹‍♀️🤹‍♂️🤹‍♀️🤹‍♂️🤹‍♀🏻🤹‍♂🏻 🤩🤩🤩🤩🤩 🤯😵😳 😲😜

牛逼。 json POST _reindex{ "source":{"query":{"match_all":{}},"_source":}, "dest":{"index":"new-index"}, "_source":"true", "script":{ "lang":"painless", "source":"ctx._doc.value +=10" } }

说明:此脚本将每条文档中的 age 字段加十, 我心态崩了。 从而演示如何在迁移过程中直接修改字段值。


③ 节流控制 requests_per_second — “缓冲区”防止拥塞 🧊❄冰山碎屑雪花 🌬风吹雪雾 雾中之雾 冷冷清清 冷冽寒风 冰蓝蓝蓝 蓝蓝蓝蓝 蓝色星空 星光闪烁 ⭐星星星星 星星⭐ 星星⭐ 星球 ⭐ 星球 ⭐⭐⭐⭐

json POST _reindex{ ... "requests_per_second":50, ... }

若你发现 cluster node CPU 超过90%, 或者 bulk 请求排队时间持续增长,就降低此值,ICU你。。


④ Timeout 设置 — 防止“挂起” ⏳⌛⌛⌛ ⏳⏳⏳ ⏳⌚⌚⌚ 垃圾堆栈 堆栈堆 栈堆栈 堆栈堆 栈堆 堆 栈 堆 場 場 場 場 場 場 场场 场场 场场 场场 场場場場場場場場場場所場所場所場所場所地方地方地方地方地方 地方 地方 地方 地方 地方地方地地地 地道道道道道道 道 道 道 道 道 道 。

json "timeout":"30s"

若超时时间太短, 新节点还没激活就结束,会出现未完成的数据拷贝。建议至少30秒以上,并结合 scroll 参数调整。


MOMENTS OF TRUTH: - ReIndex 并非一次性全盘复制, 而是分段滚动 + 批量写入 + 节流控制三部曲;细节决定成败. - 切片 能让任务并行化,提高吞吐率,但切片数量不要超过源文档总数,否则空闲线程浪费CPU. - 脚本转换是强大的功能,但请先在测试环境验证,无论是 painless、mustache 或 jsonpath,都可能主要原因是语法错误导致整个任务失败. - 操作前一定要预创建目标索引,包括 mapping 与 replica 设置,主要原因是 ReIndex 并不会自动复制这些配置. - 跨集群迁移请使用 RemoteInfo 配置 host/username/password,而非直接放 query,在 remoteinfo.query 中写查询条件即可. - 如果你看到 versionconflicts 大幅上升, 中肯。 请检查是否已经启用了 op_type:create 并且目标已有相同 ID 文档. - 成功后记得刷新 index ,否则新写入的数据仍然不可搜索 until next auto refresh period. - 再说说当你的业务对实时性要求极高,请考虑将重建工作安排到非高峰期,并监控 GC 和节点健康状态,避免 OOM 导致整个 cluster 故障. 查看完整示例代码 👇👇👇👇👇👇👇👇👇👋👋👋👋👋👋👋👋👋 👇👇 👇 👇 👇 👇 🙊🙊🙊 🙊🙊 🙊🙊🙊 🙊🙊 🙍🙏 🙍🙏 🙍🙏 🙍🙏 🙍🙏 🙍🙏 ✨✨ ✨✨ ✨✨ ✨✨ ✨✨ ✨✨ ✨✨ ✨✨ ✨✨ ✨✨ ✧✦✧✦✧✦✧✦✧✦ © 2026 年,技术博客原创内容,无任何外部链接,仅供学习交流之用。 : 所有代码均为示例,如需生产环境使用请根据实际情况修改。 © 未经授权严禁转载。

当你在夜深人静的服务器机房里 灯光闪烁,键盘敲击声回荡在墙壁间,你突然想要把一个旧索引的数据搬到一个全新的索引里——别着急,我知道这听起来像是搬家,但这其实是 Elasticsearch 的重建工作。今天我们就来聊聊它的重建 API:Reindex,不妨...。

1️⃣ 什么是 Reindex?

躺平... Reindex 并不是一个普通的复制命令, 它是一台巨大的搬运工车,能够把数据从一块地迁移到另一块地,一边还能在路途中对数据进行变形、过滤甚至重塑。你可以把它想象成一个“数据换房子”的服务——房子不变,土地可以重新规划。

Elasticsearch核心API之reindex API的应用及原理分析

1.1 我们为什么需要它?

当你的映射不再满足业务需求时 你不能简单地修改字段类型;如果你想调整分片数,却又不想等着整个集群停机, 何不... 那就得用 Reindex。还有跨集群迁移、批量删除老版本字段……一切都能靠它搞定。

1.2 语法小抄

POST _reindex {
  "source": {
    "index": "old-index",
    "query": { ... }
  },
  "dest": {
    "index": "new-index"
  }
}

嗨!这只是最简化的形式, 你可以加 slicesscriptbatchesize 等超多参数。每个参数都像是搬家时选配的工具箱,上手。。

2️⃣ 内部原理大揭秘

Aha!Reindex 可不是一次性完成,而是分段滚动+ 批量写入两步走。先用 Scroll 把源索引读出来再用 Bulk 把数据写进目标索引。 也是醉了... 下面让我们拆解一下关键组件:

2.1 DelayedPrepareBulkRequest:延迟调度的神秘武器

这个类负责把每个 Bulk 请求延迟施行,以实现节流控制。 引起舒适。 当请求速率太快时它会延迟时间,让集群喘口气。


class DelayedPrepareBulkRequest {
    private final ThreadPool threadPool;
    private final Runnable command;
    private final float requestsPerSecond;
    private final ScheduledFuture scheduled;
    ...
}

噢, 对了如果你想慢慢来可以把 requests_per_second 调到很低值, 累并充实着。 然后看着日志慢慢滚动——这种感受,比喝杯咖啡还温柔。

2.2 Sliced Scroll:并行切片,让速度翻倍!

得了吧... Sliced scroll 是 Reindex 的核心并行化技术。你只需给出 slices.max=5, 系统就会自动把任务拆成五份,每份跑在不同线程上。


POST _reindex{
  "source":{"slice":{"id":0,"max":5}},
  "dest":{"index""}
}
...
POST _reindex{
  "source":{"slice":{"id":4,"max"}...}
}

2.3 验证与错误处理——不要被 Validation 拒绝!


public ActionRequestValidationException validate {
    if .indices == null || getSearchRequest.indices.length == 0) {
        return addValidationError;
    }
}

何不... N.B.: 如果源索引没有开启 _source 或者使用了 false, 那么整个请求会直接失败—这可别掉以轻心!而且如果你一边指定 remoteInfo 与 query 参数,就会抛出验证错误;记得分别使用哦~😅。

噪音提醒:

  • * 如果你想让 Reindex 在后台异步跑, 请加上 "wait_for_completion": false *.
  • * 当你设置 op_type 为 create 时只会创建缺失文档,已存在文档会导致版本冲突。
  • * 别忘了为目标索引提前配置 mapping,否则拷贝成功后可能出现字段类型不匹配的问题。
  • * 在远程集群迁移时 务必使用 RemoteInfo 的 query 参数,而不是 source.query。
  • * 每秒请求数默认 -1, 也就是无限制;如果担心系统压力,可自行设定 throttle 参数。
  • * 切片总数大于源索引文档数时 多余切片会空跑,这也算是一种资源浪费~ 😜

随机产品对比表格——谁更强?谁更懒?🤔️️️️️️️️️️️💡💡💡💡💡💡💡💡💡⚙⚙⚙⚙⚙⚙⚙⚙⚙🌟🌟🌟🌟🌟🌟🌠🌠🌠☀☀☀☀☀☀☀☀☀🍕🍕🍕🍔🍔🍔🍺🍺🍺🥤🥤🥤🛠🛠🛠🔧🔧🔧🔩🔩🔩📦📦📦🚚🚚🚚🗃🗃🗃🏭🏭🏭🛰🛰🛰⏰⏰⏰🏆🏆🏆🔥🔥🔥😎😎😎🎉🎉🎉✨✨✨✈✈✈🚀🚀🚀🙌🙌🙌➡➡➡⬇⬇⬇➡➡➡ ⬅⬅⬅ ➖➖➖ ➕➕➕ 💬💬💬 📝📝📝 🗣🗣🗣 📢📢📢 🎤🎤🎤 📞📞📞 🚨🚨🚨 🔥🔥🔥 ⚔⚔⚔ ☑☑☑ ❌❌❌ ⭕⭕⭕ ⚪⚪⚪ 🔵🔵🔵 🔴🔴🔴 ⚫⚫⚫ 🟢🟢🟢 🟣🟣🟣 🌈🌈🌈'
产品/特性/用途/价格/性能/好评率/适合人群/是否支持ReIndex功能/是否需要手动维护/推荐指数
Elasticsearch | 全功能搜索 | 高性能 | ★★★★☆ | ★★★★☆ | 大型企业级应用 | 支持         true  →  支持完整ReIndex流程与脚本转换功能 | 是 | ★★★★★| ⭐⭐⭐⭐| 高度可 | 极致稳定性| 完整支持跨集群迁移及Sliced Scroll并行化处理| ✅ 推荐给开发者和运维人员| 🌐 强力社区支持| 🎯 对大规模数据场景极佳 Solr | 搜索平台 | 中等性能 | ★★★☆☆ | ★★★☆☆ | 中型企业级应用 | 部分支持     false → 缺少内置重建API, 需要插件或手动脚本 | 是  | ★★★☆☆| ⭐⭐⭐| 可 但维护成本较高 Meilisearch | 快速全文搜索  | ★★☆☆☆ | ★★☆☆☆ | 小型团队或个人项目 | ❌ 不支持官方ReIndex操作,需要自行编写脚本或数据库导入导出工具;适用于快速原型和轻量级部署| ❓ 是否值得投入?仅在对实时搜索有高要求且不愿意投入大量运维资源时才推荐使用。
**嘿, 各位读者朋友们**:我知道这张表格看起来像是一张卡通表情包集合,但它确实告诉你哪个产品最适合做重建任务。Elasticsearch 用力冲锋, 是最常见也是最稳妥的选择;Solr 更注重传统检索,对高级用户友好;而 Meilisearch 那轻巧无忧,更像是在沙盒里玩游戏。不过说到底, 你要根据自己的业务规模和维护能力来挑选啊~ 💪😉

温馨提示:

  • - 如果你的业务只需有时候清洗旧数据,不必频繁运行 ReIndex,可以考虑先做备份再施行,以免误删重要内容。
  • - 当涉及版本冲突时 可设置 conflicts : proceed 来继续施行,但务必检查冲突原因是否合理,否则可能导致数据不一致。
  • - 对于大规模索引迁移, 可以先做小批量测试,以确认脚本转换和 mapping 是否符合预期,然后再正式跑完全部文档。

🐱‍👓 性能优化技巧大公开 🚂 🚂 🚂 🚂 🚂 🚂

① 调整 batch_size — “吞吐量”与“内存”之间的平衡点 ♻️♻️♻️♻️♻️♻️ ♻ ♻ ♻︎︎︎︎︎︎︎︎︎︎︎︎︎︎︎︱︱︱︱︱︱︱︱︱❄❄❄❄❄ ❄ ❄ ❄ ❄

text

注意过大的 batch_size 会导致单次 bulk 请求体过大, 占满网络带宽,还可能主要原因是单个请求时间过长触发超时。 我满足了。 所以找到“最佳”值往往需要实验,多尝试几个配置并监控 JVM GC 与 ES 节点 CPU 使用率。


② 利用 Script 做即时转换 🤹‍♀️🤹‍♂️🤹‍♀️🤹‍♂️🤹‍♀🏻🤹‍♂🏻 🤩🤩🤩🤩🤩 🤯😵😳 😲😜

牛逼。 json POST _reindex{ "source":{"query":{"match_all":{}},"_source":}, "dest":{"index":"new-index"}, "_source":"true", "script":{ "lang":"painless", "source":"ctx._doc.value +=10" } }

说明:此脚本将每条文档中的 age 字段加十, 我心态崩了。 从而演示如何在迁移过程中直接修改字段值。


③ 节流控制 requests_per_second — “缓冲区”防止拥塞 🧊❄冰山碎屑雪花 🌬风吹雪雾 雾中之雾 冷冷清清 冷冽寒风 冰蓝蓝蓝 蓝蓝蓝蓝 蓝色星空 星光闪烁 ⭐星星星星 星星⭐ 星星⭐ 星球 ⭐ 星球 ⭐⭐⭐⭐

json POST _reindex{ ... "requests_per_second":50, ... }

若你发现 cluster node CPU 超过90%, 或者 bulk 请求排队时间持续增长,就降低此值,ICU你。。


④ Timeout 设置 — 防止“挂起” ⏳⌛⌛⌛ ⏳⏳⏳ ⏳⌚⌚⌚ 垃圾堆栈 堆栈堆 栈堆栈 堆栈堆 栈堆 堆 栈 堆 場 場 場 場 場 場 场场 场场 场场 场场 场場場場場場場場場場所場所場所場所場所地方地方地方地方地方 地方 地方 地方 地方 地方地方地地地 地道道道道道道 道 道 道 道 道 道 。

json "timeout":"30s"

若超时时间太短, 新节点还没激活就结束,会出现未完成的数据拷贝。建议至少30秒以上,并结合 scroll 参数调整。


MOMENTS OF TRUTH: - ReIndex 并非一次性全盘复制, 而是分段滚动 + 批量写入 + 节流控制三部曲;细节决定成败. - 切片 能让任务并行化,提高吞吐率,但切片数量不要超过源文档总数,否则空闲线程浪费CPU. - 脚本转换是强大的功能,但请先在测试环境验证,无论是 painless、mustache 或 jsonpath,都可能主要原因是语法错误导致整个任务失败. - 操作前一定要预创建目标索引,包括 mapping 与 replica 设置,主要原因是 ReIndex 并不会自动复制这些配置. - 跨集群迁移请使用 RemoteInfo 配置 host/username/password,而非直接放 query,在 remoteinfo.query 中写查询条件即可. - 如果你看到 versionconflicts 大幅上升, 中肯。 请检查是否已经启用了 op_type:create 并且目标已有相同 ID 文档. - 成功后记得刷新 index ,否则新写入的数据仍然不可搜索 until next auto refresh period. - 再说说当你的业务对实时性要求极高,请考虑将重建工作安排到非高峰期,并监控 GC 和节点健康状态,避免 OOM 导致整个 cluster 故障. 查看完整示例代码 👇👇👇👇👇👇👇👇👇👋👋👋👋👋👋👋👋👋 👇👇 👇 👇 👇 👇 🙊🙊🙊 🙊🙊 🙊🙊🙊 🙊🙊 🙍🙏 🙍🙏 🙍🙏 🙍🙏 🙍🙏 🙍🙏 ✨✨ ✨✨ ✨✨ ✨✨ ✨✨ ✨✨ ✨✨ ✨✨ ✨✨ ✨✨ ✧✦✧✦✧✦✧✦✧✦ © 2026 年,技术博客原创内容,无任何外部链接,仅供学习交流之用。 : 所有代码均为示例,如需生产环境使用请根据实际情况修改。 © 未经授权严禁转载。