繁体   English   中英

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

[英]How to get all terms for a Lucene field in Lucene 4

我正在尝试将我的代码从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驱动搜索的方式)。

如果您将SegmentReader传递给MultiFields.fields ,它将只返回reader.fields() ,因此在这种情况下没有性能reader.fields()

获得非空字段后,您可以执行以下操作:

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

这些terms可以为null (例如,如果该字段不存在)。

一旦你有一个非null术语,你可以获得这样的枚举:

 TermsEnum termsEnum = terms.iterator(); 

返回的TermsEnum不会为null。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM