8.3. Using an IndexReader
Queries in Lucene are executed on an
IndexReader
. Hibernate Search caches all index readers to maximize performance. Your code can access this cached resources, but you have to follow some "good citizen" rules.
Example 8.3. Accessing an 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); }
The ReaderProvider (described in Section 2.3, “Reader strategy”), will open an IndexReader on top of the index(es) referenced by the directory providers. Because this
IndexReader
is shared amongst several clients, you must adhere to the following rules:
- Never call indexReader.close(), but always call readerProvider.closeReader(reader), preferably in a finally block.
- Do not use this
IndexReader
for modification operations (you would get an exception). If you want to use a read/write index reader, open one from the Lucene Directory object.
Aside from those rules, you can use the IndexReader freely, especially to do native queries. Using the shared
IndexReader
s will make most queries more efficient.