Lucene如何在内部执行删除操作?

时间:2014-01-25 08:45:51

标签: java lucene

我知道每个文档都有一个标志,当我们删除文档时,Lucene会取消它。我需要了解更多关于它的细节,因为我想在很多索引上使用它,性能对我来说很重要。

Lucene如何找到旗帜?删除的磁盘利用率是多少?

1 个答案:

答案 0 :(得分:1)

Lucene将已删除文档标记为扩展名为.del的文件,此文件格式为:Format,Header,ByteCount,BitCount,Bits | DGaps(取决于格式)

  • Format,ByteSize,BitCount - > UINT32
  • 比特 - > BYTECOUNT
  • DGaps - > NonzeroBytesCount
  • DGap - > VINT
  • NonOnesByte - >字节
  • 标题 - > CodecHeader

格式为1:表示清除了DGaps。

ByteCount表示Bits中的字节数。它通常是(SegSize / 8)+1。

BitCount表示当前在位中设置的位数。

每个索引的文档的位包含一位。清除与文档编号对应的位时,该文档被标记为已删除。比特排序从最小到最重要。因此,如果Bits包含两个字节0x00和0x02,则文档9被标记为活动(未删除)。

DGaps比Bits更有效地表示稀疏位向量。它由Bits中的nonOnes字节索引上的DGap和非单词字节本身组成。不存储位(NonOnesBytesCount)中的nonOnes字节数。

例如,如果有8000位且仅清除了10,12,32位,则将使用DGaps:

(VInt)1,(字节)20,(VInt)3,(字节)1

lucene I / O操作取决于打开的IndexWriterIndexWriter的对象数量,这意味着如果要删除或索引文档数,可以保存在一次I / O点击中,在完成工作的情况下使用writer.commit()writer.close()

我想说的是创建和初始化IndexWriter是成本,而lucene建议使用一个IndexWriter对象。

Here你可以找到关于lucene的所有事情。