SeamFramework.orgCommunity Documentation

Chapitre 29. Hibernate Search

29.1. Introduction
29.2. La configuration
29.3. Utilisation

Les moteurs de recherches plein texte comme Apache Lucene™ sont une technologie très puissante qui apporte la recherche plain texte et l'efficacité des requêtes dans les applications. Hibernate Search qui utilise Apache Lucene soujacent indexe votre modèle du domaine avec quelques annotations additionnelles, prends garde à la synchronisation base de données / indexes et retourne des objets opérationnels qui correspondent aux requêtes de recherche plain texte. Gardez à l'esprit qu'il peut avoir des erreurs qui apparaisssent avec un modèle de domaine objet par dessus un index de textes (conserver l'index à jours, erreur entre la structure de l'index et le modèle du domaine, et erreurs dans les requêtes). Mais les avantages de la vitesse et de l'efficacité va au delà de ces limitations.

Hibernate Search a été conçu pour s'intégrer facilement et naturellement que possible avec JPA et Hibernate. Comme une extension naturelle, JBoss Seam fourni une intégration avec Hibernate Search.

Merci de vous référer à Hibernate Search documentation pour plus d'information spécifique sur le projet Hibernate Search.

Hibernate Search est configuré aussi bien dans le fichier META-INF/persistence.xml que dans le fichier hibernate.cfg.xml.

La configuration d'Hibernate Search configuration est par défaut judicieuse pour la plus part des paramètre de configuration. Ici n configuration d'une unité de persistance minimale pour démarrer.


<persistence-unit name="sample">
   <jta-data-source
>java:/DefaultDS</jta-data-source>
   <properties>
      [...]
      <!-- use a file system based index -->
      <property name="hibernate.search.default.directory_provider" 
         value="org.hibernate.search.store.FSDirectoryProvider"/>
      <!-- directory where the indexes will be stored -->
      <property name="hibernate.search.default.indexBase" 
         value="/Users/prod/apps/dvdstore/dvdindexes"/>
   </properties>
</persistence-unit
>

Si vous plannifier de cibler Hibernate Annotations ou EntityManager 3.2.x (embarqué dans JBoss AS 4.2.x et suppérieur), vous allez avoir besoin de configurer les écouteurs d'évènement appropriés.


<persistence-unit name="sample">
   <jta-data-source
>java:/DefaultDS</jta-data-source>
   <properties>
      [...]
      <!-- use a file system based index -->
      <property name="hibernate.search.default.directory_provider" 
                value="org.hibernate.search.store.FSDirectoryProvider"/>
      <!-- directory where the indexes will be stored -->
      <property name="hibernate.search.default.indexBase" 
                value="/Users/prod/apps/dvdstore/dvdindexes"/>

      <property name="hibernate.ejb.event.post-insert" 
                value="org.hibernate.search.event.FullTextIndexEventListener"/>
      <property name="hibernate.ejb.event.post-update" 
                value="org.hibernate.search.event.FullTextIndexEventListener"/>
      <property name="hibernate.ejb.event.post-delete" 
                value="org.hibernate.search.event.FullTextIndexEventListener"/>
                
   </properties>
</persistence-unit
>

En plus du fichier de configuration, les jars suivants doivent être déployés:

Hibernate Search utlise les annotations pour faire correspondre les entités à l'index de Lucene, vérifiez la documentation de référence pour plus d'informations.

Hibernate Search est pleinement intégré avec les API et la sémentique JPA / Hibernate. Le basculement des requêtes HQL ou Criteria nécéssite juste quelques lignes de codes. L'API principale à intéragir avec est l'API FullTextSession (sousclasse de Session d'Hibernate ).

Quand Hibernate Search est présent, JBoss Seam injecte un FullTextSession.

@Stateful

@Name("search")
public class FullTextSearchAction implements FullTextSearch, Serializable {
   @In FullTextSession session;
   public void search(String searchString) {
      org.apache.lucene.search.Query luceneQuery = getLuceneQuery();
      org.hibernate.Query query session.createFullTextQuery(luceneQuery, Product.class);
      searchResults = query
            .setMaxResults(pageSize + 1)
            .setFirstResult(pageSize * currentPage)
            .list();
   }
   [...]
}

Note

FullTextSession étend org.hibernate.Session ainsi il peut être utilisé avec une Hibernate Session habituelle

Si l'API de Persistence de Java est utilisée, une intégration en douceur est proposée.

@Stateful

@Name("search")
public class FullTextSearchAction implements FullTextSearch, Serializable {
   
   @In FullTextEntityManager em;
   public void search(String searchString) {
      org.apache.lucene.search.Query luceneQuery = getLuceneQuery();
      javax.persistence.Query query = em.createFullTextQuery(luceneQuery, Product.class);
      searchResults = query
            .setMaxResults(pageSize + 1)
            .setFirstResult(pageSize * currentPage)
            .getResultList();
   }
   [...]
}

Quand Hibernate Search est présent, un FulltextEntityManager est injecté. FullTextEntityManager étends EntityManager avec des méthodes de recherche spécifique, de la même façon que FullTextSession étends Session.

Quand une Session EJB3.0 ou une injection de Message Driven Bean est utilisé (par exemple via l'annotation @PersistenceContext), il ets possible de remplacer l'interface de EntityManager par l'interface de FullTextEntityManager dans la partie déclaration. Cependant, l'implémentation injectée sera une implémentation de FullTextEntityManager: la conversion est ensuite possible.

@Stateful

@Name("search")
public class FullTextSearchAction implements FullTextSearch, Serializable {
  
   @PersistenceContext EntityManager em;
   public void search(String searchString) {
      org.apache.lucene.search.Query luceneQuery = getLuceneQuery();
      FullTextEntityManager ftEm = (FullTextEntityManager) em;
      javax.persistence.Query query = ftEm.createFullTextQuery(luceneQuery, Product.class);
      searchResults = query
            .setMaxResults(pageSize + 1)
            .setFirstResult(pageSize * currentPage)
            .getResultList();
   }
   [...]
}

Attention

Pour les personnes abituées à Hibernate Search sans Seam, notez que l'utilisation de Search.getFullTextSession n'est pas nécéssaire.

Voyez le DVDStore dans les exemples de blog de la distribution de JBoss Seam pour une utilisation concrète de Hibernate Search.