我正在尝试将我的代码从 Lucene 3.4 更新到 4.1。我想出了除了一个之外的变化。我有代码需要遍历一个字段的所有术语值。在 Lucene 3.1 中有一个 IndexReader#terms() 方法提供了一个 TermEnum,我可以对其进行迭代。对于 Lucene 4.1,这似乎已经改变,即使在文档中搜索了几个小时后,我也无法弄清楚如何。有人可以指出我正确的方向吗?
谢谢。
请遵循Lucene 4 迁移指南::
您获取枚举的方式已经改变。主要入口点是
Fields
类。如果您知道您的阅读器是单段阅读器,请执行以下操作:Fields fields = reader.Fields(); if (fields != null) { ... }
如果读者可能是多段的,你必须这样做:
Fields fields = MultiFields.getFields(reader); if (fields != null) { ... }
fields
可能是(例如,null
如果阅读器没有字段)。请注意,该
MultiFields
方法需要对 性能造成影响MultiReaders
,因为它必须即时合并术语/文档/位置。如果可以的话,通常最好改为获取顺序阅读器(使用oal.util.ReaderUtil
),然后自己逐步浏览这些阅读器(这就是 Lucene 驱动搜索的方式)。如果您将 a 传递
SegmentReader
给MultiFields.fields
它,它将简单地返回reader.fields()
,因此在这种情况下不会影响性能。一旦你有一个非空字段,你可以这样做:
Terms terms = fields.terms("field"); if (terms != null) { ... }
terms
可能是(例如,如果该null
字段不存在)。一旦你有一个非
null
条款,你可以得到一个这样的枚举:TermsEnum termsEnum = terms.iterator();
返回的
TermsEnum
不会为空。然后你可以
.next()
通过TermsEnum