首页/数据/NoSQL 速查/_forcemerge 段合并与空间回收
Elasticsearch89 条

_forcemerge 段合并与空间回收

段合并把大量小段合成大段,减少段数量与磁盘占用、提升查询效率;max_num_segments=1 表示合到单段,only_expunge_deletes 只清理已删除文档。

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

_forcemerge 做什么

段合并把大量小段合成大段:段数少了,查询时打开的文件与元数据开销下降,被标记删除的文档也会在合并中真正丢弃、释放磁盘。force merge 就是手动触发这件事,并可以指定最终合并到多少个段。

基本信息

接口POST /<index>/_forcemerge
常用参数max_num_segments=1、only_expunge_deletes=true、wait_for_completion=false
适用对象只读或极少写入的索引,活跃写入的索引不要例行执行
不可中断任务开始后不能取消或回滚,只能等它跑完
前置检查先确认磁盘余量,合并过程需要额外临时空间

典型使用场景

  • 滚动后的老索引收尾:合并成单段再归档或删除
  • 清理大量已删除文档,回收被标记删除占据的磁盘
  • 检索变慢的只读索引:减少段数提升查询效率
  • 快照前整理索引,减小快照体积与恢复时间
  • 排查段数异常增长,判断是写入过碎还是合并被限流

常用写法

常用写法
# 合并到单段,异步执行避免请求阻塞
POST /logs-2023/_forcemerge?max_num_segments=1&wait_for_completion=false

# 只清理已删除文档,不做完整合并
POST /logs-2023/_forcemerge?only_expunge_deletes=true

# 查看任务进度
GET /_tasks?actions=*forcemerge&detailed=true

# 合并前后对比段数与体积
GET /logs-2023/_stats/segments,store?level=indices

参数与取舍

参数作用注意
max_num_segments目标段数,1 表示合成单段段越少查询越快但合并耗时越长
only_expunge_deletes只清理已删除文档不做完整合并,耗时相对短
wait_for_completion是否同步等待结果大索引必须设为 false
flush合并完成后是否刷盘一般保持默认即可
合并期间占用磁盘 IO 与临时空间,且不能中断回滚,应安排在业务低峰并同步观察节点 IO 与磁盘水位。
合并出的大段是不可变文件,后续写入只能追加新段;索引仍有持续写入时,合并成果很快会被稀释,这类索引更适合依赖自动合并策略而不是手工合并。

易错点

  • 对持续写入的索引执行 force merge 会与后台自动合并互相拖累,收益低而风险高
  • 合并会重写全部段,磁盘需要预留额外空间,水位接近阈值时应先扩容再合并
  • 把 force merge 当例行运维:索引仍在写入时,合并出的大段很快会因新数据重新分裂,白白消耗 IO
  • 执行时不加 wait_for_completion=false,长任务会把客户端请求挂住直到超时,而合并实际上仍在后台继续

数据来源与参考

  • Elasticsearch Guide: Force merge API
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌