Java 如何获取Lucene 4中Lucene字段的所有项

Java 如何获取Lucene 4中Lucene字段的所有项,java,api,lucene,Java,Api,Lucene,我正在尝试将我的代码从Lucene 3.4更新到4.1。除了一个以外,我还算出了变化。我有一段代码,需要对一个字段的所有项值进行迭代。在Lucene 3.1中,有一个IndexReader#terms()方法提供TermEnum,我可以对它进行迭代。对于Lucene 4.1来说,这似乎已经改变了,即使在文档中搜索了几个小时,我也不知道是如何改变的。有人能给我指一下正确的方向吗 谢谢。请按照以下步骤操作: 获取枚举的方式已更改。主要入口点是 字段类。如果您知道您的读者是单段读者,请执行以下操作:

我正在尝试将我的代码从Lucene 3.4更新到4.1。除了一个以外,我还算出了变化。我有一段代码,需要对一个字段的所有项值进行迭代。在Lucene 3.1中,有一个IndexReader#terms()方法提供TermEnum,我可以对它进行迭代。对于Lucene 4.1来说,这似乎已经改变了,即使在文档中搜索了几个小时,我也不知道是如何改变的。有人能给我指一下正确的方向吗

谢谢。

请按照以下步骤操作:

获取枚举的方式已更改。主要入口点是
字段
类。如果您知道您的读者是单段读者,请执行以下操作: 这:

如果读卡器可能是多段的,则必须执行以下操作:

Fields fields = MultiFields.getFields(reader);
if (fields != null) {
  ...
}
Terms terms = fields.terms("field");
if (terms != null) {
  ...
}
字段
可能为
null
(例如,如果读卡器没有字段)

请注意,
MultiFields
方法需要对性能产生影响
多阅读器
,因为它必须动态合并术语/文档/位置。它是 通常,最好使用顺序读取器(使用
oal.util.ReaderUtil
),然后亲自浏览这些阅读器, 如果可以(这就是Lucene推动搜索的方式)

如果将
段读取器
传递给
多字段
它将 返回
reader.fields()
,因此在这种情况下不会影响性能

一旦有了非空字段,就可以执行以下操作:

Fields fields = MultiFields.getFields(reader);
if (fields != null) {
  ...
}
Terms terms = fields.terms("field");
if (terms != null) {
  ...
}
术语
可能为
null
(例如,如果该字段不存在)

一旦您有一个非空的terms,您就可以得到如下枚举:

TermsEnum termsEnum = terms.iterator();
返回的
TermsEnum
将不为空

然后,您可以通过
TermsEnum


很高兴提到移民指南,但我认为如果你能在这里发布与问题相关的部分以及你的建议,你的答案会有用得多。我只是在上面的问题中添加了相关部分。我只是将答案部分移到你标记的答案中,因为在问题中搜索和找到答案可能会让人感到困惑和不直观配方。