【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 毫不相干,自然也不会保留任何"空洞"。

相关推荐
cyh男2 天前
Lucene 8.7.0 版本中dvd、dvm文件详解
lucene
是犹橐籥2 天前
头歌Educoder答案 Lucene - 全文检索入门
搜索引擎·全文检索·lucene
cyh男3 天前
Lucene 8.7.0 版本中docFreq、totalTermFreq、getDocCount等方法的含义
lucene
cyh男4 天前
Lucene 8.7.0 版本中doc、tim、tip、tmd文件详解
lucene
极限实验室11 天前
搜索百科(1):Lucene —— 打开现代搜索世界的第一扇门
搜索引擎·lucene
一路向北North14 天前
lucene渲染未命中最匹配的关键词和内容
搜索引擎·全文检索·lucene
risc12345624 天前
【lucene】advanceshallow就是遍历跳表的,可以看作是跳表的遍历器
lucene
cyh男24 天前
Lucene 8.7.0 版本的索引文件格式
搜索引擎·全文检索·lucene
risc12345625 天前
【lucene核心】impacts的由来
lucene
在未来等你1 个月前
Elasticsearch面试精讲 Day 5:倒排索引原理与实现
elasticsearch·搜索引擎·面试·全文检索·lucene·分词·倒排索引