Segment = 一组索引文件的集合
它不是一个文件,而是多个文件组成的"包"
就像一个"压缩包"里装了多个文件:
_0.tim + _0.tip + _0.doc + ... = Segment _0
| 维度 | Memory Buffer | Segment (内存) | Segment Files (磁盘) |
|---|---|---|---|
| 内容 | 原始文档 JSON | 已建索引的数据结构 | 索引文件 |
| 索引状态 | ❌ 无索引 | ✅ 倒排索引已建立 | ✅ 倒排索引已持久化 |
| 可搜索? | ❌ 不可搜索 | ✅ 可搜索 | ✅ 可搜索 |
| 位置 | JVM 堆内存 | JVM 堆内存 (内存映射) | 磁盘文件 |
| 持久性 | ❌ 宕机丢失 | ❌ 宕机丢失 (靠 Translog 恢复) | ✅ 持久化 |
| 触发条件 | 写入时 | refresh (默认1秒) | flush 或达到阈值 |
一个 Segment 包含以下文件 (都在磁盘上):
.tim.tip.doc
Segment 不是一种数据格式,而是一个索引"包"
• Memory Buffer = 原始数据,还没建索引
• Segment (内存) = Buffer 数据经过分词+建索引,在 JVM 里
• Segment (磁盘) = 刷到磁盘的 Segment,持久化
• Merge = 把多个小 Segment 合并成大 Segment
为什么内存和磁盘都有?
因为它们是同一套数据结构的不同生命周期阶段:
内存中先建索引 → 可搜索 → 刷到磁盘持久化