8.3. IndexReader の使用

Lucene のクエリは IndexReader で実行されます。Hibernate Search はパフォーマンスを最大化するためにすべてのインデックスリーダーをキャッシュします。コードはこのキャッシュされたリソースにアクセスできますが、 "good citizen" ルールに従う必要があります。

例8.3 IndexReader へのアクセス

DirectoryProvider orderProvider = searchFactory.getDirectoryProviders(Order.class)[0];
DirectoryProvider clientProvider = searchFactory.getDirectoryProviders(Client.class)[0];

ReaderProvider readerProvider = searchFactory.getReaderProvider();
IndexReader reader = readerProvider.openReader(orderProvider, clientProvider);

try {
    //do read-only operations on the reader
}
finally {
    readerProvider.closeReader(reader);
}
ReaderProvider (「リーダー方針」 で説明) はディレクトリプロバイダにより参照されたインデックス上で IndexReader をオープンにします。この IndexReader は複数のクライアントで共有されるため、以下のルールに従う必要があります。
  • indexReader.close() は呼び出さず、常に readerProvider.closeReader(reader) を呼び出します (理想的には Finally Block で)。
  • 変更操作にはこの IndexReader を使用しないでください (例外が発生します)。読み取り/書き込みインデックスリーダーを使用する場合は、Lucene Directory オブジェクトからオープンします。
これらのルール以外に、特にネイティブクエリを実行するために IndexReader を自由に使用できます。共有された IndexReader を使用すると、ほとんどのクエリが効率的になります。