13.4.3. Reconstruction de l'index
Si vous changez le mappage de l'entité de l'index, l'index entier risque d'avoir besoin d'être mis à jour. Par exemple, si vous décidez d'indexer un champ existant en utilisant un analyseur différent, vous aurez besoin de reconstruire l'index pour les types affectés. Si la base de données est remplacée (restaurée après une sauvegarde ou importée d'un système hérité par exemple), il vous faudra reconstruire l'index à partir de données existantes. Hibernate Search fournit deux stratégies principales au choix :
- Utiliser
FullTextSession.flushToIndexes()de manière périodique tout en utilisantFullTextSession.index()sur d'autres entités. - Utiliser un
MassIndexer.
13.4.3.1. Utilisation de flushToIndexes() Copier lienLien copié sur presse-papiers!
Copier lienLien copié sur presse-papiers!
Cette stratégie consiste à retirer l'index existant puis à y ajouter à nouveau toutes les entités à l'aide de
FullTextSession.purgeAll() et FullTextSession.index(). Il existe cependant quelques contraintes de mémoire et d'efficacité. Pour garantir une plus grande efficacité, Hibernate Search regroupe les opérations d'index et les exécute au moment de la validation. Si un grand nombre de données doit être indexé, veuiller faire attention à la consommation de la mémoire puisque tous les documents seront placés dans une file d'attente jusqu'à la validation de la transaction. Une erreur intitulée OutOfMemoryException peut apparaître si vous ne videz pas la file d'attente régulièrement, ce que vous pouvez faire à l'aide de fullTextSession.flushToIndexes(). À chaque application de la méthode fullTextSession.flushToIndexes() (ou lorsque la transaction est validée), la file d'attente est traitée et les modifications d'index sont appliquées. Veuillez noter qu'une fois le vidage effectué, les modifications sont irréversibles.
Exemple 13.59. Reconstruction de l'index à l'aide de index() et flushToIndexes()
fullTextSession.setFlushMode(FlushMode.MANUAL);
fullTextSession.setCacheMode(CacheMode.IGNORE);
transaction = fullTextSession.beginTransaction();
//Scrollable results will avoid loading too many objects in memory
ScrollableResults results = fullTextSession.createCriteria( Email.class )
.setFetchSize(BATCH_SIZE)
.scroll( ScrollMode.FORWARD_ONLY );
int index = 0;
while( results.next() ) {
index++;
fullTextSession.index( results.get(0) ); //index each element
if (index % BATCH_SIZE == 0) {
fullTextSession.flushToIndexes(); //apply changes to indexes
fullTextSession.clear(); //free memory since the queue is processed
}
}
transaction.commit();
Note
hibernate.search.default.worker.batch_size a été remplacé par cette API explicite et offrant un meilleur contrôle
Utilisez si possible une taille de lot qui garantit que votre application ait suffisamment de mémoire : une taille de lot plus importante permet aux objets d'être récupérés plus rapidement depuis la base de données mais elle utilise aussi plus de mémoire.