【lucene】文档id docid
删除后文档id 还会被复用吗?不会。
在 Lucene 里,docID 是一次性、不可复用的。
- 同一个段(segment)内,docID 从 0 开始连续递增;一旦分配给某篇文档,就终身绑定,即使该文档随后被删除,这个号码也永远空出来,不会再次分配给新文档。
- 当段合并(merge)产生新的段时,旧段被丢弃,新段的 docID 会重新从 0 开始连续编号,但这属于“新生成”的号码空间,与旧段已删除的 docID 没有继承关系。
- 因此,对于外部调用者而言,docID 在单个 IndexReader/IndexSearcher 生命周期内始终保持稳定且唯一;删除造成的空洞不会被回填。
一句话:
删除只是把 docID 标记为“无效”,但该号码不会被后续新文档复用。
也就是是在一个segment段内,docid是一次性的?
是的——在同一个 segment 内部,docID 是一次性的。
- 每个文档追加进来时,分配一个只增不减的整数 docID(从 0 开始)。
- 删除只是把对应 bit 在 `liveDocs` 里置 0;这个 docID 永远不会再被该 segment 里的新文档复用。
- 当 segment 合并后,新 segment 会重新生成全新的、连续的 docID 序列,但原 segment 的 docID 已随旧 segment 一起被丢弃,因此仍不存在复用。
合并后 文档id仍旧是从0开始分配吧?
对,合并后生成的新 segment,其 docID 会重新从 0 开始连续分配。
合并过程会把参与合并的所有旧 segment 里“仍然存活”的文档再写一遍,按写入顺序重新编号:0、1、2… 。旧 segment 及其 docID 随后会被物理删除,因此新 segment 的 docID 与旧 segment 毫不相干,自然也不会保留任何“空洞”。