コードを 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