Domanda

Ho appena iniziato l'integrazione di Hibernate Search con la mia domanda Hibernate. I dati sono indicizzati usando Hibernate Session ogni volta che avvio il server.

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     

E 'molto scomodo e il server impiega 10 minuti per iniziare. Sto facendo il questo in modo giusto?

ho scritto un programmatore che aggiornerà periodicamente gli indici. Sarà questo aggiornamento le voci di indice esistenti automaticamente, o creare indici duplicati?

È stato utile?

Soluzione

Come dettagliato nella guida Hibernate Search, punto 3.6.1, se si utilizza le annotazioni (ormai l'impostazione predefinita), gli ascoltatori, che lanciano l'indicizzazione sul negozio sono registrati per impostazione predefinita:

  

Hibernate Search è abilitata dalla   scatola quando si utilizza Hibernate Annotazioni   o sospensione EntityManager. Se, per   qualche motivo avete bisogno di disattivarlo,   impostato   hibernate.search.autoregister_listeners   false.

Un esempio su come accenderli a mano:

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

Tutto quello che dovete fare è annotare le entità che si desidera essere indicizzato con il

@Indexed(index = "fulltext")

annotazione, e poi fare l'annotazione a grana fine sui campi, come descritto nel manuale d'uso.

Per questo si deve né lanciare l'indicizzazione a mano durante la memorizzazione, né l'indicizzazione rilancio whae l'applicazione viene avviata, se non avete le entità che sono stati memorizzati prima indicizzazione è stata attivata.

È possibile ottenere problemi di prestazioni quando si memorizzano un oggetto che dire ha un "attacco" e così si sono indicizzazione che nello stesso ambito della transazione che si memorizza l'entità. Vedi qui:

Hibernate Search e il testo in linea di estrazione

di una soluzione che risolve questo problema.

Altri suggerimenti

A condizione che si sta utilizzando un FSDirectoryProvider (che è il default) l'indice di Lucene viene mantenuto sul disco. Questo significa che non v'è alcuna necessità di indice molto all'avvio. Se avete database esistente che si desidera, naturalmente, per creare un indice iniziale utilizzando la funzionalità fullTextSession.index (). Tuttavia, questo non dovrebbe essere all'avvio dell'applicazione. Consideriamo esponendo una sorta di grilletto URL o interfaccia di amministrazione. Una volta che hai l'indice iniziale mi sento di raccomandare di utilizzare l'indicizzazione automatica. Ciò significa che l'indice di Lucene viene aggiornato automaticamente se un libri vengono creati / aggiornati / cancellati. indicizzazione automatica dovrebbe essere attivata per impostazione predefinita.

Vi consiglio di consultare le sezioni automatiche e manuali di indicizzazione nel manuale online - http://docs.jboss.org/hibernate/stable/search/reference/en/html_single

- Hardy

Attualmente uso indicizzazione automatica di Hibernate Search con JPA e funziona molto bene. Per creare gli indici inizialmente si può chiamare il seguente:

    FullTextEntityManager fullTextEntityManager = 
                    Search.getFullTextEntityManager(entityManager);

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

dove "entityManager" è solo un javax.persistence.EntityManager. L'indice di volontà di sopra di tutti i campi contrassegnati con @Field per tutte le entità contrassegnato come @Indexed.

Poi, finché si fa tutti gli aggiornamenti, ecc, attraverso il gestore di entità gli indici vengono aggiornati automaticamente. È quindi possibile cercare come al solito, ma essere sicuri di ricreare l'EntityManager su ogni ricerca (è possibile utilizzare l'EntityManagerFactory di farlo).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top