[英]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.