Frage

Ich habe gerade angefangen Hibernate Search mit meiner Hibernate-Anwendung zu integrieren. Die Daten werden mithilfe von Hibernate Session indiziert jedes Mal wenn ich den Server starten.

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     

Es ist sehr umständlich und der Server dauert 10 Minuten zu starten. Bin ich dies in der richtigen Art und Weise zu tun?

Ich schrieb einen Scheduler, der die Indizes in regelmäßigen Abständen aktualisiert. Werde dieses Update der bestehenden Indexeinträge automatisch oder erstellen doppelten Indizes?

War es hilfreich?

Lösung

Wie in der Hibernate Search Guide detailliert beschrieben, Abschnitt 3.6.1, wenn Sie Anmerkungen verwenden (mittlerweile der Standard), die Zuhörer, die Indizierung auf Speicher starten werden standardmäßig registriert:

  

Hibernate Search ist aus der aktivierten   Feld bei der Verwendung von Hibernate Annotations   oder Hibernate EntityManager. Wenn wegen   einiger Grund, warum Sie es deaktivieren müssen,   einstellen   hibernate.search.autoregister_listeners   auf false gesetzt.

Ein Beispiel, wie man sie von Hand aktivieren:

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

Alles, was Sie tun müssen, ist die Entitäten mit Anmerkungen versehen, die Sie mit der indiziert werden sollen

@Indexed(index = "fulltext")

Anmerkung, und führen Sie dann die feinkörnige Anmerkung auf den Feldern, wie in der Bedienungsanleitung beschrieben.

Sie sollten also weder die Indizierung von Hand starten, wenn die Speicherung, weder Relaunch Indizierung whae die Anwendung gestartet, es sei denn, Sie haben Einheiten, die gespeichert wurden, bevor die Indizierung aktiviert wurde.

Sie können Performance-Probleme bekommen, wenn Sie ein Objekt zu speichern, die eine „Anlage“, sagen hat und so indizieren Sie, dass im gleichen Umfang der Transaktion, die das Unternehmen speichert. Siehe hier:

Hibernate Search und Offline-Textextraktion

für eine Lösung, die dieses Problem löst.

Andere Tipps

Sofern Sie eine FSDirectoryProvider verwenden der Lucene-Index (dies ist die Standardeinstellung) wird auf der Festplatte bestehen bleibt. Das heißt, es besteht keine Notwendigkeit, Index auf sehr Start. Wenn Sie Datenbank vorhandene haben möchten Sie natürlich einen Anfangsindex der fullTextSession.index () Funktionalität erstellen verwenden. Dies sollte aber nicht auf Start der Anwendung. Betrachten wir irgendeine Art von Trigger-URL aussetzt, oder Admin-Interface. Wenn Sie den Anfangsindex haben würde ich empfehlen, die automatische Indizierung zu verwenden. Dies bedeutet, dass der Lucene-Index aktualisiert wird automatisch, wenn ein Buch erstellt erhalten / aktualisiert / gelöscht. Automatische Indizierung sollte auch standardmäßig aktiviert werden.

Ich empfehle Sie, beziehen sich auf die automatischen und manuellen Indexierung Abschnitte im Online-Handbuch - http://docs.jboss.org/hibernate/stable/search/reference/en/html_single

- Hardy

Ich verwende derzeit Hibernate Search automatische Indizierung mit JPA und es funktioniert wirklich gut. So erstellen Sie Ihre Indizes zunächst können Sie einfach die folgenden nennen:

    FullTextEntityManager fullTextEntityManager = 
                    Search.getFullTextEntityManager(entityManager);

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

Dabei steht "EntityManager" ist nur ein javax.persistence.EntityManager. Die oben indiziert alle Felder mit @Field für alle Objekte markiert markiert als @Indexed.

Dann solange Sie alle Updates zu tun, usw., durch die Einrichtung Manager werden die Indizes automatisch aktualisiert. Sie können dann wie gewohnt suchen, aber sicher sein, Ihre EntityManager auf jeder Suche neu erstellen (Sie können die EntityManagerFactory können dies tun).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top