SeamFramework.orgCommunity Documentation
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
>
Il n'est plus nécéssaire d'enregistrer les écouteurs d'évènements si Hibernate Annotations ou EntityManager 3.3.x sont utilisés. Quand on utilise Hibernate Search 3.1.x quelques écouteurs d'évènements sont nécéssaire, mais ils sont automatiquement enregistrés par Hibernate Annotations; référeez vous au guide d'Hibernate Search pour sa configuration sans EntityManager et les Annotations.
En plus du fichier de configuration, les jars suivants doivent être déployés:
hibernate-search.jar
hibernate-commons-annotations.jar
lucene-core.jar
Si vous déployez ceux là dans un EAR, n'oubliez pas de mettre à jours application.xml
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();
}
[...]
}
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();
}
[...]
}
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.