13.6.2. Utilisation d'un IndexReader
Les requêtes dans Lucene sont exécutées sur un
IndexReader
. Hibernate Search peut effectuer une mise en cache des lecteurs d'index pour maximiser la performance, ou pour fournir d'autres stratégies efficaces pour récupérer un IndexReader
mis à jour en minimisant les opérations E/S. Votre code peut accéder ces ressources mises en cache, mais il existe plusieurs pré-requis.
Exemple 13.66. Accès à un IndexReader
IndexReader reader = searchFactory.getIndexReaderAccessor().open(Order.class); try { //perform read-only operations on the reader } finally { searchFactory.getIndexReaderAccessor().close(reader); }
Dans cet exemple, la
SearchFactory
détermine les index requis pour effectuer une demande de cette entité (stratégie de partitionnement). L'utilisation de la ReaderProvider
configurée sur chaque index renvoie un composant IndexReader
au-dessus de tous les index impliqués. Cette IndexReader
étant partitionné pour plusieurs clients, vous devez adhérer aux règles suivantes :
- Ne jamais appeler indexReader.close(), mais utiliser plutôt readerProvider.closeReader(reader) si nécessaire, de préférence dans un bloc finally.
- Ne pas utiliser
IndexReader
pour des modifications (il s'agit d'uneIndexReader
: toute modification entraînera une exception).
À part ces règles, vous pouvez utiliser
IndexReader
librement, particulièrement pour effectuer des requêtes Lucene natives. L'utilisation des IndexReader
partagés rendra la plupart des requêtes plus efficaces que si elles étaient ouvertes directement à partir du filesystem par exemple.
À la place de la méthode
open(Class... types)
, vous pouvez utiliser open(String... indexNames)
, une méthode vous permettant de passer dans un ou plusieurs noms d'index. Cette stratégie vous permet également de sélectionner un sous-ensemble d'index pour chaque type indexé si le partitionnement est utilisé.
Exemple 13.67. Accéder à une IndexReader by index names
IndexReader reader = searchFactory.getIndexReaderAccessor().open("Products.1", "Products.3");