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 を使用すると、ほとんどのクエリが効率的になります。