12

コードを Lucene 3.4 から 4.1 に更新しようとしています。1つを除いて変更点を見つけました。1 つのフィールドのすべての用語値を反復処理する必要があるコードがあります。Lucene 3.1 には、繰り返し処理できる TermEnum を提供する IndexReader#terms() メソッドがありました。これは Lucene 4.1 で変更されたようで、ドキュメントを数時間検索しても方法がわかりません。誰かが私を正しい方向に向けることができますか?

ありがとう。

4

1 に答える 1

4

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

于 2013-03-08T19:52:55.273 に答える