簡體   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