Question

Je viens de commencer à intégrer Hibernate Search avec mon application Mise en veille prolongée. Les données sont indexées en utilisant Hibernate session chaque fois que je commence le serveur.

FullTextSession fullTextSession = Search.getFullTextSession(session);
Transaction tx = fullTextSession.beginTransaction();

List books = session.createQuery("from Book as book").list();
for (Book book : books) {
    fullTextSession.index(book);
}

tx.commit(); //index is written at commit time     

Il est très maladroit et le serveur prend 10 minutes pour commencer. Est-ce que je fais cela dans la bonne façon?

J'ai écrit un planificateur qui mettra à jour les index périodiquement. Est-ce que cette mise à jour les entrées d'index existantes automatiquement, ou créer des indices en double?

Était-ce utile?

La solution

Comme indiqué dans le guide Hibernate Search, section 3.6.1, si vous utilisez des annotations (maintenant la valeur par défaut), les auditeurs qui lancent l'indexation sur la boutique sont enregistrés par défaut:

  

Hibernate Search est activé sur la   boîte lors de l'utilisation des annotations Hibernate   ou Hibernate EntityManager. Si, pour   une raison que vous avez besoin de le désactiver,   ensemble   hibernate.search.autoregister_listeners   false.

Un exemple sur la façon de les activer manuellement:

 hibConfiguration.setListener("post-update", new FullTextIndexEventListener());
 hibConfiguration.setListener("post-insert", new FullTextIndexEventListener());
 hibConfiguration.setListener("post-delete", new FullTextIndexEventListener());

Tout ce que vous devez faire est de annoter les entités que vous souhaitez être indexé avec le

@Indexed(index = "fulltext")

annotation, puis faire l'annotation à grains fins sur les champs, comme indiqué dans le guide de l'utilisateur.

Donc, vous devriez ne pas lancer l'indexation à la main lors de l'enregistrement, ni indexation relancement whae l'application démarre, sauf si vous avez des entités qui ont été stockés avant l'indexation a été activé.

Vous pouvez avoir des problèmes de performances lorsque vous enregistrez un objet qui a une dire « attachement » et ainsi vous indexez que, dans le même périmètre de la transaction qui stocke l'entité. Voir ici:

extraction Hibernate Recherche et texte hors ligne

pour une solution qui résout ce problème.

Autres conseils

Pourvu que vous utilisez un FSDirectoryProvider (qui est la valeur par défaut) l'index Lucene est conservé sur le disque. Cela signifie qu'il n'y a pas besoin d'indexer au démarrage même. Si vous avez la base de données existante, vous voulez bien sûr de créer un index initial en utilisant la fonctionnalité fullTextSession.index (). Cependant, cela ne devrait pas être au démarrage de l'application. Pensez à exposer une sorte d'URL de déclenchement ou de l'interface d'administration. Une fois que vous avez l'index initial Je recommande d'utiliser l'indexation automatique. Cela signifie que l'index Lucene est mis à jour automatiquement si un livres sont créées / mises à jour / supprimé. L'indexation automatique doit également être activé par défaut.

Je vous recommande de vous reporter aux sections d'indexation automatique et manuel dans le manuel en ligne - http://docs.jboss.org/hibernate/stable/search/reference/en/html_single

- Hardy

J'utilise actuellement l'indexation automatique de Hibernate Search avec JPA et il fonctionne très bien. Pour créer vos index, vous pouvez d'abord il suffit d'appeler les éléments suivants:

    FullTextEntityManager fullTextEntityManager = 
                    Search.getFullTextEntityManager(entityManager);

    try {
       fullTextEntityManager.createIndexer().startAndWait();
    } catch (InterruptedException e) {
       // Exception handling
    }

où "entityManager" est juste un javax.persistence.EntityManager. L'indice de volonté au-dessus de tous les champs marqués d'@field pour toutes les entités marquées comme @Indexed.

Alors aussi longtemps que vous faites toutes vos mises à jour, etc, par le gestionnaire d'entités dont les index sont automatiquement mis à jour. Vous pouvez alors effectuer des recherches comme d'habitude, mais assurez-vous de recréer votre EntityManager sur chaque recherche (vous pouvez utiliser le EntityManagerFactory pour le faire).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top