我正在尝试将我的代码从Lucene 3.4更新到4.1。我发现除了一个以外的变化。我有代码需要迭代一个字段的所有术语值。在Lucene 3.1中,有一个IndexReader#terms()方法提供了一个TermEnum,我可以迭代它。这似乎已经改变了Lucene 4.1,甚至在文档中搜索几个小时后我也无法弄清楚如何。有人可以指出我正确的方向吗?
感谢。
答案 0 :(得分:2)
请关注Lucene 4 Migration guide ::
如何获取枚举已更改。主要入口点是
Fields
课程。如果您知道您的阅读器是单段阅读器,那么就做 这个:Fields fields = reader.Fields(); if (fields != null) { ... }
如果阅读器可能是多段的,则必须执行此操作:
Fields fields = MultiFields.getFields(reader); if (fields != null) { ... }
fields
可能是null
(例如,如果读者没有字段)。请注意,
MultiFields
方法会影响性能MultiReaders
,因为它必须动态合并术语/文档/职位。它的 通常更好地取代顺序读者(使用oal.util.ReaderUtil
)然后亲自介绍一下这些读者, 如果可以的话(这就是Lucene推动搜索的方式)。如果您将
SegmentReader
传递给MultiFields.fields
,那就简单了 返回reader.fields()
,因此在这种情况下没有性能损失。获得非空字段后,您可以执行此操作:
Terms terms = fields.terms("field"); if (terms != null) { ... }
terms
可能是null
(例如,如果该字段不存在)。如果您有非
null
条款,则可以获得这样的枚举:TermsEnum termsEnum = terms.iterator();
返回的
TermsEnum
不会为空。然后,您可以
.next()
通过TermsEnum