【问题标题】:How to get all terms for a Lucene field in Lucene 4如何在 Lucene 4 中获取 Lucene 字段的所有术语
【发布时间】:2013-03-08 09:44:51
【问题描述】:

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

谢谢。

【问题讨论】:

  • 我刚刚将答案部分移至您标记的答案,因为在问题公式中搜索和查找答案可能会令人困惑且不直观。

标签: java api lucene


【解决方案1】:

请关注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 不会为空。

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

【讨论】:

  • 很高兴提及迁移指南,但我认为如果您可以在此处发布与问题相关的部分以及您的建议,您的回答会更有用。
  • 我刚刚在上面的问题中添加了相关部分。
猜你喜欢
  • 1970-01-01
  • 2013-02-20
  • 1970-01-01
  • 2015-02-20
  • 1970-01-01
  • 2018-11-17
  • 2012-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多