如何获得Lucene 4中Lucene场的所有术语

时间:2013-03-08 09:44:51

标签: java api lucene

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

感谢。

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