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

相关推荐
sniper_fandc4 小时前
Elasticsearch从入门到进阶——搜索优化原理
elasticsearch·搜索引擎·lucene·1024程序员节
酥酥禾4 天前
C# LINQ常用语法
solr·lucene
cyh男13 天前
lucene中AutomatonQuery类的作用
lucene
cyh男13 天前
lucene中的PointRangeQuery和PointInSetQuery有什么区别
lucene
cyh男13 天前
为什么ES中不推荐使用wildcard查询
elasticsearch·lucene
渣渣盟15 天前
中文分词技术全解析
搜索引擎·全文检索·lucene
cyh男1 个月前
lucene 8.7.0 版本中的倒排索引、数字、DocValues三种类型的查询性能对比
lucene
cyh男1 个月前
Lucene 8.7.0 版本中dvd、dvm文件详解
lucene
是犹橐籥1 个月前
头歌Educoder答案 Lucene - 全文检索入门
搜索引擎·全文检索·lucene
cyh男1 个月前
Lucene 8.7.0 版本中docFreq、totalTermFreq、getDocCount等方法的含义
lucene