Lucene 从索引文件中获取所有未删除的文档
Lucene get all non deleted document from index file
我正在尝试从 Lucene Index(尚未删除)获取所有文档。
我听说如果我从 Lucene Index 中删除一些东西,Lucene 不会立即从文件中删除。
所以我想从未删除的索引文件中获取文档。
这不可能。当您从 Lucene 索引中删除一个文档时,它不会立即被删除,因为重建所有索引的成本非常高。这个旧文档被标记为在索引优化时明确删除。但它不再可见了。它只是在 Lucene 内部可见。如果您删除了一个文档并提交了它,它就再也无法获取了。
Lucene 提供了所有未删除文档的位集,称为liveDocs
。可以通过iterating over all LeafReader
s (or using the SlowCompositeReaderWrapper
) and calling the liveDocs
method or by using the MultiFields
class.
获取
一旦你有了这个 bitset,你就可以从 0
迭代到 IndexReader#maxDoc
并查询 bitset 来了解一个 docid 是代表一个已删除的文档还是一个活跃的文档。您可以访问已删除文档的所有存储字段,就像访问实时文档一样。
但是,一旦某个段被合并,其删除的文档将被永久删除,从而从索引中删除。
我正在尝试从 Lucene Index(尚未删除)获取所有文档。
我听说如果我从 Lucene Index 中删除一些东西,Lucene 不会立即从文件中删除。
所以我想从未删除的索引文件中获取文档。
这不可能。当您从 Lucene 索引中删除一个文档时,它不会立即被删除,因为重建所有索引的成本非常高。这个旧文档被标记为在索引优化时明确删除。但它不再可见了。它只是在 Lucene 内部可见。如果您删除了一个文档并提交了它,它就再也无法获取了。
Lucene 提供了所有未删除文档的位集,称为liveDocs
。可以通过iterating over all LeafReader
s (or using the SlowCompositeReaderWrapper
) and calling the liveDocs
method or by using the MultiFields
class.
一旦你有了这个 bitset,你就可以从 0
迭代到 IndexReader#maxDoc
并查询 bitset 来了解一个 docid 是代表一个已删除的文档还是一个活跃的文档。您可以访问已删除文档的所有存储字段,就像访问实时文档一样。
但是,一旦某个段被合并,其删除的文档将被永久删除,从而从索引中删除。