_cat/segments 是什么
段是 Lucene 索引的最小存储单元:每个分片由若干段组成,写入先落到内存缓冲,refresh 后成为一个新段,后台再把小段逐步合并成大段。_cat/segments 列出每个分片下的段数量、文档数、已删除文档标记与占用大小,用来评估合并压力与「段爆炸」。段数长期保持几百以上、且已删除文档占比很高时,对只读索引做一次强制合并通常能降低查询开销。
基本信息
| 接口 | GET /_cat/segments?v |
|---|---|
| 关键列 | index、shard、segment、docs.count、docs.deleted、size、committed |
| 段来源 | 每次 refresh 产生新段,后台合并逐步回收 |
| 判断依据 | 段数量与已删除文档占比 |
| 对应操作 | 只读索引可做 force merge |
| 所属系统 | Elasticsearch / OpenSearch |
典型使用场景
- 评估合并压力:看段数与大小分布,判断后台合并是否跟得上写入
- 排查段爆炸:批量导入前后对比段数量变化
- 回收空间:确认已删除文档占比,评估强制合并的收益
- 定位查询变慢:同一分片段数激增时查询需要遍历更多段
- 只读索引优化:归档索引合并成少量大段,减少查询与恢复开销
查看与统计
查看与统计
GET /_cat/segments/logs-2024.01?v&h=index,shard,segment,docs.count,docs.deleted,size,committed
GET /_cat/segments/logs-2024.01?v | wc -l # 粗略统计段行数
# 只读索引可强制合并为较少段数(正在写入的索引不要做)
# POST /logs-2024.01/_forcemerge?max_num_segments=1输出的列读法
| 列 | 含义 | 异常表现 |
|---|---|---|
| index / shard | 索引与分片 | 定位到具体分片 |
| segment | 段标识 | 同分片段数过多说明合并跟不上 |
| docs.count | 段内文档数 | 小段极多说明刷新过于频繁 |
| docs.deleted | 已删除标记数 | 占比高说明空间尚未回收 |
| size | 段占用大小 | 碎片化严重时小段总量偏大 |
| committed | 是否已提交 | 未提交的段在重启后表现不同 |
每个段自身也有固定开销(内存结构、文件句柄),段数过多会同时拖慢查询与分片恢复速度,这是段数量需要关注的真正原因。
已删除文档只是被标记,磁盘空间要等合并后才真正回收;看到 docs.deleted 很大不必立刻扩容,先确认合并任务是否在正常推进。
force merge 会长时间占用磁盘 IO 与 CPU,应安排在低峰执行,避免同时操作多个大索引,也避免对仍在写入的索引执行。