Lucene est une bibliothèque de la fondation Apache fournissant un moteur de recherche en Java hautement performant. Hibernate Annotations inclut un ensemble d'annotations qui vous permettent de marquer n'importe quel objet du modèle de données comme indexable et de laisser Hibernate maintenir un index Lucene de toutes les instances persistées via Hibernate.
Hibernate Lucene est un projet en cours et de nouvelles fonctionnalités sont en préparation. Donc attendez-vous à certains changements avec les versions ultérieures.
Tout d'abord, nous devons déclarer une classe persistante comme étant indexable. Ceci se fait en annotant la classe avec @Indexed :
@Entity @Indexed(index="indexes/essays") public class Essay { ... }
L'attribut index indique à Hibernate quel est le nom du répertoire Lucene (en général un répertoire de votre système de fichiers). Si vous souhaitez définir un répertoire de départ pour tous vos index Lucene, vous pouvez utiliser la propriété hibernate.lucene.default.indexDir dans votre fichier de configuration.
Les index Lucene contiennent quatre types de champs : keyword, text, unstored et unindexed. Hibernate Annotations fournit des annotations pour marquer une propriété d'une entité comme étant d'un des trois premiers types.
@Entity @Indexed(index="indexes/essays") public class Essay { ... @Id @Keyword(id=true) public Long getId() { return id; } @Text(name="Abstract") public String getSummary() { return summary; } @Lob @Unstored public String getText() { return text; } }
Ces annotations définissent un index avec trois champs : id, Abstract et text. Notez que par défaut le nom du champ n'a plus de majuscules, en suivant la spécification JavaBean.
Note : vous devez spécifier @Keyword(id=true) sur la propriété identifiante de votre entité.
Lucene a la notion of boost factor. C'est un moyen de donner plus de poids à un champ ou à un élément indexé durant la procédure d'indexation. Vous pouvez utiliser @Boost au niveau du champ ou de la classe.
La classe analyste utilisée pour indexer les éléments est configurable par la propriété hibernate.lucene.analyzer. Si aucune n'est définie, org.apache.lucene.analysis.standard.StandardAnalyzer est utilisée par défaut.
Lucene a une notion de Directory où l'index est stocké. L'implémentation de Directory peut être personnalisée mais Lucene arrive, avec deux implémentations prêtes à l'emploi complètes, une sur un système de fichiers et une en mémoire. Hibernate Lucene a la notion de DirectoryProvider qui gère la configuration et l'initialisation du Directory Lucene.
Tableau 5.1. Liste des Directory Providers intégrés
Classe | Description | Propriétés |
---|---|---|
org.hibernate.lucene.store.FSDirectoryProvider | Directory base sur le système de fichiers. Le répertoire utilisé sera <indexBase>/<@Index.name> | indexBase : répertoire de départ |
org.hibernate.lucene.store.RAMDirectoryProvider | Directory utilisant la mémoire, le directory sera uniquement identifié par l'élément @Index.name | aucune |
Si les directory providers intégrés ne répondent pas à vos besoins, vous pouvez écrire votre propre directory provider en implémentant l'interface org.hibernate.store.DirectoryProvider.
Chaque entité indexée est associée à un index Lucene (un index peut être partagé par différentes entités mais ce n'est pas le cas en général). Vous pouvez configurer l'index à travers des propriétés préfixées par hibernate.lucene.<indexname>. Les propriétés par défaut héritées par tous les index peuvent être définies en utilisant le préfixe hibernate.lucene.default.
Pour définir le directory provider d'un index donné, utilisez hibernate.lucene.<indexname>.directory_provider.
hibernate.lucene.default.directory_provider org.hibernate.lucene.store.FSDirectoryProvider hibernate.lucene.default.indexDir=/usr/lucene/indexes hibernate.lucene.Rules.directory_provider org.hibernate.lucene.store.RAMDirectoryProvider
appliqué à
@Indexed(name="Status") public class Status { ... } @Indexed(name="Rules") public class Rule { ... }
Ceci créera un directory système de fichiers dans /usr/lucene/indexes/Status où les entités Status seront indexées, et utilisera un directory mémoire nommé Rules où les entités Rule seront indexées.
Donc vous pouvez facilement définir des règles générales comme le directory provider et le répertoire de départ, et surcharger ces valeurs par défaut plus tard pour chaque index.
En écrivant votre propre DirectoryProvider, vous pouvez aussi bénéficier de ce mécanisme de configuration.
Finalement, nous activons le LuceneEventListener pour les trois événements Hibernate qui ont lieu après que les changements sont validés dans la base de données.
<hibernate-configuration> ... <event type="post-commit-update" <listener class="org.hibernate.lucene.event.LuceneEventListener"/> </event> <event type="post-commit-insert" <listener class="org.hibernate.lucene.event.LuceneEventListener"/> </event> <event type="post-commit-delete" <listener class="org.hibernate.lucene.event.LuceneEventListener"/> </event> </hibernate-configuration>