12

我正在尝试将我的代码从 Lucene 3.4 更新到 4.1。我想出了除了一个之外的变化。我有代码需要遍历一个字段的所有术语值。在 Lucene 3.1 中有一个 IndexReader#terms() 方法提供了一个 TermEnum,我可以对其进行迭代。对于 Lucene 4.1,这似乎已经改变,即使在文档中搜索了几个小时后,我也无法弄清楚如何。有人可以指出我正确的方向吗?

谢谢。

4

1 回答 1

4

请遵循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 传递SegmentReaderMultiFields.fields它,它将简单地返回reader.fields(),因此在这种情况下不会影响性能。

一旦你有一个非空字段,你可以这样做:

Terms terms = fields.terms("field");
if (terms != null) {
  ...
}

terms可能是(例如,如果该null字段不存在)。

一旦你有一个非null条款,你可以得到一个这样的枚举:

TermsEnum termsEnum = terms.iterator();

返回的TermsEnum不会为空。

然后你可以.next()通过TermsEnum

于 2013-03-08T19:52:55.273 回答