下面是对Lucene 段(Segment)中 docId 机制的详细、系统性讲解,涵盖其设计原理、结构、生命周期、使用方式以及与 Elasticsearch 的关系。
“
docId不是一成不变的,docId 会随段合并而改变,不具备持久性
”
🧱 一、什么是 docId?
在 Lucene 中,docId(文档 ID)是一个从0开始的整数,用于在单个 Segment 内部唯一标识一个文档。
- 它是局部的(per-segment),不是全局唯一的。
- 它不是用户可见的,而是 Lucene 内部用于高效访问文档的“数组下标”。
- 它不等于
_id,也不具备持久性。
🔗 二、全局 docId vs 局部 docId
1.局部 docId(Segment 内部)
- 每个 Segment 是一个独立的倒排索引 + 正向存储单元。
- 文档写入 Segment 后,按顺序分配
0, 1, 2, ..., N-1的局部 docId。 - 所有内部结构(如倒排链、doc values、stored fields)都通过这个局部 docId 索引。
✅ 示例:
Segment S1: docId=0 → {"_id": "A", "title": "hello"} docId=1 → {"_id": "B", "title": "world"}