尝试将一些Lucene 3代码转换为Lucene 4,
我想使用termEnums.docs(ir.getLiveDocs())仅返回特定术语尚未删除的文档。但是getLiveDocs()仅适用于AtomicReaders,虽然我只有一个索引,但它基于文件并使用DirectoryReader(它是CompositeReader的子类)。
所以我想我可以使用SlowCompositeReaderWrapper,但这个名字让我不知所措,但我不明白的是,几乎每个人都使用基于文件系统的索引,几乎并不是每个人都使用CompositeReaders?
然而,文档似乎暗示我们应该使用AtomicReaders,但我不明白我如何使用基于文件的索引来实现这一点,也许如果基于文件的索引只有一个段,但不是由Lucene因为它需要它们而且通常不受最终用户应用程序的严密控制。
答案 0 :(得分:6)
好问题。这可能是从lucene 3迁移到lucene 4时最常见的一个。 首先看一下this article,这解释了重构背后的原因。
基本上一切都是lucene中的每个细分市场,但是一些lucene 3 API没有反映出这一点。 lucene 3中IndexReader
暴露的一些方法只是合并了来自所有段的大量信息并且做了很慢的事情,这就是命名SlowCompositeReaderWrapper
的原因。我们的想法是从每个细分中获取您需要的信息并自行合并。 AtomicReader
允许您访问单个段,而CompositeReader
是整个索引的视图,但不会公开以前通过IndexReader
可用的所有方法。