14.6.2. IndexReader の使用
Lucene のクエリーは
IndexReader
で実行されます。Hibernate Search は、パフォーマンスを最大化するためにインデックスリーダーをキャッシュするか、更新された IndexReader
軽減 I/O 操作を取得するために他の効率的なストラテジーを提供する場合があります。コードはこれらのキャッシュされたリソースにアクセスできますが、要件がいくつかあります。
例14.71 IndexReader
へのアクセス
IndexReader reader = searchFactory.getIndexReaderAccessor().open(Order.class); try { //perform read-only operations on the reader } finally { searchFactory.getIndexReaderAccessor().close(reader); }
この例では、
SearchFactory
は (シャード化ストラテジーに関連して) このエンティティーのクエリーに必要なインデックスを判別します。各インデックスで設定された ReaderProvider
を使用して、関連するすべてのインデックスの上に複合 IndexReader
を返します。この IndexReader
は複数のクライアント間で共有されるため、以下のルールに従う必要があります。
- IndexReader.close() を呼び出さず、必要に応じて readerProvider.closeReader(reader) を finally ブロックで使用します。
- 変更操作には、この
IndexReader
を使用しないでください (読み取り専用のIndexReader
であり、このような試行によって例外が発生します)。
これらのルール以外に、特にネイティブな Lucene クエリーを行うため、
IndexReader
を自由に使用できます。共有 IndexReader
s を使用すると、たとえばファイルシステムから直接開くよりも、ほとんどのクエリーがより効率的になります。
方法の代替として
open(Class... types)
あなたが使用することができますopen(String... indexNames)
、1 つ以上のインデックス名を渡すことができます。このストラテジーを使用して、シャードが使用される場合に、インデックスタイプに対してインデックスのサブセットを選択することもできます。
例14.72 インデックス名による IndexReader
へのアクセス
IndexReader reader = searchFactory.getIndexReaderAccessor().open("Products.1", "Products.3");