Red Hat Training

A Red Hat training course is available for Red Hat JBoss Enterprise Application Platform

23.2.3. Configuration de DirectoryProvider

Un DirectoryProvider est l'abstraction d'Hibernate Search autour d'un Directory de Lucene qui gère la configuration et l'initialisation des ressources de Lucene sous-jacentes. Les fournisseurs de répertoires et leurs propriétés affiche la liste des fournisseurs de répertoires disponibles dans Hibernate Search, ainsi que leurs options correspondantes.
Chaque entité indexée est associée à un index de Lucene (sauf quand plusieurs entités partagent un même index). Le nom de l'index est donné par la propriété index de l'annotation @Indexed. Si la propriété index n'est pas spécifiée, le nom complet de la classe indexée servira de nom (recommandé).
Le DirectoryProvider et toute option supplémentaire peuvent être configurés en utilisant le préfixe hibernate.search. < indexname >. Le nom par default (hibernate.search.default) est réservé et peut être utilisé pour définir les propriétés qui s'appliquent à tous les indexes. Exemple 23.2, « Configurer les fournisseurs de répertoires » montre comment hibernate.search.default.directory_provider est utilisée pour définir le fournisseur de répertoire par défaut du système de fichiers. hibernate.search.default.indexBase définit ensuite le répertoire de base par défaut de l'index. Ainsi, l'index de l'entité Status est créé dans /usr/lucene/indexes/org.hibernate.example.Status.
L'index de l'entité Rule, cependant, utilise un répertoire en mémoire, car le fournisseur de répertoires par défaut de cette entité est substitué par la propriété hibernate.search.Rules.directory_provider.
Finalement, l'entité Action utilise un fournisseur de répertoire personnalisé CustomDirectoryProvider spécifié par hibernate.search.Actions.directory_provider.

Exemple 23.1. Spécifier le nom d'index

package org.hibernate.example;

@Indexed
public class Status { ... }

@Indexed(index="Rules")
public class Rule { ... }

@Indexed(index="Actions")
public class Action { ... }

Exemple 23.2. Configurer les fournisseurs de répertoires

hibernate.search.default.directory_provider = filesystem
hibernate.search.default.indexBase=/usr/lucene/indexes
hibernate.search.Rules.directory_provider = ram
hibernate.search.Actions.directory_provider = com.acme.hibernate.CustomDirectoryProvider

Note

En utilisant le schéma de configuration décrit, vous pourrez facilement définir des règles communes comme le fournisseur de répertoire ou le répertoire de base, et remplacer ces valeurs par défaut plus tard, un index à la fois.

Les fournisseurs de répertoires et leurs propriétés

ram
Aucun
système de fichiers
Répertoire basé système de fichiers. Le répertoire utilisé sera <indexBase>/< indexName >
  • indexBase : répertoire de base
  • indexName: remplace @Indexed.index (utile pour les index partitionnés)
  • locking_strategy : en option, voir Section 23.2.7, « Configuration LockFactory »
  • filesystem_access_type: permet de déterminer le type exact de l'implémentation FSDirectory utilisée par ce fournisseur de répertoire DirectoryProvider. Les valeurs autorisées sont auto (la valeur par défaut, NIOFSDirectory sur les systèmes non Windows, SimpleFSDirectory sur les systèmes Windows), simple (SimpleFSDirectory), nio (NIOFSDirectory), mmap (MMapDirectory). Consulter les Javadocs de ces implémentations de Directory avant de modifier cette configuration. Malgré le fait que NIOFSDirectory ou MMapDirectory peuvent apporter des gains de performance appréciables, ils ont aussi leurs problèmes associés.
filesystem-master
Répertoire basé système de fichiers. Tout comme filesystem, il copie également l'index dans un répertoire source régulièrement.
La valeur recommandée pour la période d'actualisation est (au moins) 50 % plus élevée que le temps qu'il faut pour copier les informations (par défaut 3 600 secondes - 60 minutes).
Notez que la copie est basée sur un mécanisme de copie incrémental qui réduit le temps moyen de copie.
DirectoryProvider utilisé normalement sur le noeud maître dans un cluster JMS Backend.
La taille buffer_size_on_copy optimum dépendra de votre système d'exploitation et de la mémoire dont vous disposez. La plupart des gens rapportent qu'ils ont de bons résultats en utilisant des valeurs entre 16 et 64Mo.
  • indexBase: répertoire de base
  • indexName: remplace @Indexed.index (utile pour les index partitionnés)
  • sourceBase: répertoire de base source (copie).
  • source: suffixe du répertoire source (valeur par défaut @Indexed.index). Le nom du répertoire source étant <sourceBase>/<source>
  • refresh: période de réactualisation en secondes (la copie aura lieu tous les refresh secondes). Si une copie est toujours en cours quand la période refresh a expiré, la seconde opération de copie sera ignorée.
  • buffer_size_on_copy: le montant de mégaoctets à déplacer dans un seule instruction de copier de bas niveau; la valeur par défaut est 16 Mo.
  • locking_strategy : en option, voir Section 23.2.7, « Configuration LockFactory »
  • filesystem_access_type: permet de déterminer le type exact de l'implémentation FSDirectory utilisée par ce fournisseur de répertoire DirectoryProvider. Les valeurs autorisées sont auto (la valeur par défaut, NIOFSDirectory sur les systèmes non Windows, SimpleFSDirectory sur les systèmes Windows), simple (SimpleFSDirectory), nio (NIOFSDirectory), mmap (MMapDirectory). Consulter les Javadocs de ces implémentations de Directory avant de modifier cette configuration. Malgré le fait que NIOFSDirectory ou MMapDirectory peuvent apporter des gains de performance appréciables, ils ont aussi leurs problèmes associés que vous devez connaître.
filesystem-slave
Répertoire basé système de fichiers. Ressemble au système de fichiers, mais extrait une version maître (source) régulièrement. Pour éviter le verrouillage et les résultats de recherche inconsistants, 2 copies locales sont conservées.
La valeur recommandée pour la période d'actualisation est (au moins) 50 % plus élevée que le temps qu'il faut pour copier les informations (par défaut 3 600 secondes - 60 minutes).
Notez que la copie est basée sur un mécanisme de copie incrémentielle, réduisant le temps de copie moyen. Si une copie est en cours d'exécution quand la période refresh expire, la seconde opération de copie sera ignorée.
DirectoryProvider normalement utilisé sur des noeuds esclaves utilisant un JMS Backend.
La taille buffer_size_on_copy optimum dépendra de votre système d'exploitation et de la mémoire dont vous disposez. La plupart des gens rapportent qu'ils ont de bons résultats en utilisant des valeurs entre 16 et 64Mo.
  • indexBase: répertoire de base
  • indexName: remplace @Indexed.index (utile pour les index partitionnés)
  • sourceBase: répertoire de base source (copie)
  • source: suffixe du répertoire source (valeur par défaut @Indexed.index). Le nom du répertoire source étant <sourceBase>/<source>
  • refresh: période de réactualisation en secondes
  • buffer_size_on_copy: le montant de mégaoctets à déplacer dans un seule instruction de copier de bas niveau; la valeur par défaut est 16 Mo.
  • locking_strategy : en option, voir Section 23.2.7, « Configuration LockFactory »
  • retry_marker_lookup : optionnel, valeur par défaut 0. Définit le nombre de fois qu'Hibernate Search ira chercher les fichiers de marqueurs dans le répertoire source avant d'échouer. Attend 5 secondes entre chaque tentative.
  • retry_initialize_period : facultatif, définissez une valeur entière en quelques secondes pour permettre à la nouvelle tentative initialiser caractéristique : si l'esclave ne peut pas trouver l'index maître il réessayera jusqu'à ce qu'il se trouve dans le fond, sans pour autant empêcher l'application à démarrer : les requêtes de texte intégral effectuées avant l'initialisation de l'index ne sont pas bloqués, mais retournera les résultats vides. Quand pas l'activation de l'option ou explicitement mise à zéro, il échoue avec une exception au lieu de planifier une minuterie de réessayer. Pour empêcher l'application de démarrer sans un index non valide, mais toujours pas à contrôler un délai d'initialisation, consultez plutôt le retry_marker_lookup.
  • filesystem_access_type: permet de déterminer le type exact de l'implémentation FSDirectory utilisée par ce fournisseur de répertoire DirectoryProvider. Les valeurs autorisées sont auto (la valeur par défaut, NIOFSDirectory sur les systèmes non Windows, SimpleFSDirectory sur les systèmes Windows), simple (SimpleFSDirectory), nio (NIOFSDirectory), mmap (MMapDirectory). Consulter les Javadocs de ces implémentations de Directory avant de modifier cette configuration. Malgré le fait que NIOFSDirectory ou MMapDirectory peuvent apporter des gains de performance appréciables, vous devez vous familiariser avec les problèmes associés.

Note

Si les fournisseurs de répertoire intégré ne correspondent pas à vos besoins, vous pouvez écrire votre propre fournisseur de répertoire, en implémentant l'interface org.hibernate.store.DirectoryProvider. Dans ce cas, passez le nom de classe complet de votre fournisseur dans la propriété directory_provider. Vous pouvez passer des propriétés supplémentaires en utilisant le préfixe hibernate.search. < indexname >.