コードを Lucene 3.4 から 4.1 に更新しようとしています。1つを除いて変更点を見つけました。1 つのフィールドのすべての用語値を反復処理する必要があるコードがあります。Lucene 3.1 には、繰り返し処理できる TermEnum を提供する IndexReader#terms() メソッドがありました。これは 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
に aを渡すと、MultiFields.fields
単純に が返さreader.fields()
れるため、パフォーマンスに影響はありません。null 以外のフィールドを取得したら、これを行うことができます。
Terms terms = fields.terms("field"); if (terms != null) { ... }
terms
可能性があります(たとえば、null
フィールドが存在しない場合)。非
null
条件を取得したら、次のような列挙型を取得できます。TermsEnum termsEnum = terms.iterator();
返さ
TermsEnum
れる は null ではありません。その後
.next()
、TermsEnum