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 baseindexName
: 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émentationFSDirectory
utilisée par ce fournisseur de répertoireDirectoryProvider
. Les valeurs autorisées sontauto
(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 deDirectory
avant de modifier cette configuration. Malgré le fait queNIOFSDirectory
ouMMapDirectory
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 taillebuffer_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 baseindexName
: 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 lesrefresh
secondes). Si une copie est toujours en cours quand la périoderefresh
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émentationFSDirectory
utilisée par ce fournisseur de répertoireDirectoryProvider
. Les valeurs autorisées sontauto
(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 deDirectory
avant de modifier cette configuration. Malgré le fait queNIOFSDirectory
ouMMapDirectory
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érioderefresh
expire, la seconde opération de copie sera ignorée.DirectoryProvider normalement utilisé sur des noeuds esclaves utilisant un JMS Backend.La taillebuffer_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 baseindexName
: 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 secondesbuffer_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 leretry_marker_lookup
.filesystem_access_type
: permet de déterminer le type exact de l'implémentationFSDirectory
utilisée par ce fournisseur de répertoireDirectoryProvider
. Les valeurs autorisées sontauto
(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 deDirectory
avant de modifier cette configuration. Malgré le fait queNIOFSDirectory
ouMMapDirectory
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 >.