_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 与磁盘水位。
合并出的大段是不可变文件,后续写入只能追加新段;索引仍有持续写入时,合并成果很快会被稀释,这类索引更适合依赖自动合并策略而不是手工合并。