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

相关推荐
risc1234563 小时前
【lucene】lucene索引文件的读取器都是单向的只能向前不能后退读
lucene
chenglin0163 天前
ClickHouse、Doris、OpenSearch、Splunk、Solr系统化分析
clickhouse·solr·lucene
Freed&9 天前
倒排索引:Elasticsearch 搜索背后的底层原理
大数据·elasticsearch·搜索引擎·lucene
risc1234569 天前
【lucene】ByteBufferGuard
lucene
risc12345611 天前
【lucene】使用docvalues的案例
lucene
risc12345611 天前
【lucene】currentFrame与staticFrame
lucene
risc12345612 天前
【lucene】IndexOptions
全文检索·lucene
risc12345612 天前
【lucene】SegmentCoreReaders
lucene
risc12345615 天前
【lucene】BlockMaxConjunctionScore
lucene