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