Pregunta

Acabo de empezar a integrar Hibernate Search con mi solicitud de hibernación. Los datos se indexa mediante el uso de Hibernate sesión cada vez que se inicia el servidor.

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 muy incómodo y el servidor tarda 10 minutos para empezar. Estoy haciendo esto en forma correcta?

escribí un programador que permitirá actualizar periódicamente los índices. ¿Esta actualización de las entradas de índice existentes de forma automática, o crear índices duplicados?

¿Fue útil?

Solución

Como se detalla en la guía de hibernación de la búsqueda, la sección 3.6.1, si está utilizando anotaciones (por ahora el valor por defecto), los oyentes, que lanza la indexación en la tienda están registrados por defecto:

  

hibernación está habilitada la búsqueda de la   cuadro cuando se utiliza Anotaciones de Hibernate   o Hibernate EntityManager. Si por   alguna razón necesita para desactivarlo,   conjunto   hibernate.search.autoregister_listeners   false.

Un ejemplo de cómo activarlos manualmente:

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

Todo lo que necesita hacer es anotar las entidades que desea ser indexada con el

@Indexed(index = "fulltext")

anotación, y luego hacer la anotación de grano fino en los campos, como se detalla en el manual del usuario.

Por lo que debe poner en marcha ni la indexación con la mano cuando el almacenamiento, ni la indexación relanzamiento whae se inicia la aplicación, a menos que tenga las entidades que han sido almacenados antes de activar la indexación.

Usted puede obtener los problemas de rendimiento cuando se está almacenando un objeto que decir tiene una "unión" y por lo que están indexando que en el mismo ámbito de la transacción que está almacenando la entidad. Ver aquí:

Hibernate Search y texto en línea de extracción

para una solución que resuelve este problema.

Otros consejos

Con tal que usted está usando un FSDirectoryProvider (que es el valor por defecto) el índice Lucene se conserva en el disco. Esto significa que no hay necesidad de índice en muy puesta en marcha. Si ha de base de datos existente que desea, por supuesto, para crear un índice inicial utilizando la funcionalidad fullTextSession.index (). Sin embargo, esto no debería ser el inicio de la aplicación. Considere la exposición de algún tipo de url gatillo, o interfaz de administración. Una vez que tenga el índice inicial recomendaría utilizar la indexación automática. Esto significa que el índice de Lucene se actualiza automáticamente si se crean unos libros / modificado / borrado. la indexación automática también debe ser activado por defecto.

Le recomiendo que consulte las secciones de indexación automática y manual en el manual en línea - http://docs.jboss.org/hibernate/stable/search/reference/en/html_single

- Hardy

Actualmente uso de la indexación automática de Hibernate Search con APP y funciona muy bien. Para crear sus índices inicialmente sólo se puede llamar al siguiente:

    FullTextEntityManager fullTextEntityManager = 
                    Search.getFullTextEntityManager(entityManager);

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

donde "entityManager" es sólo un javax.persistence.EntityManager. El índice voluntad por encima de todos los campos marcados con @Field para todas las entidades marcado como @Indexed.

A continuación, siempre y cuando usted hace todas sus actualizaciones, etc, a través del gestor de la entidad los índices se actualizan automáticamente. A continuación, puede buscar como de costumbre, pero asegúrese de volver a crear el EntityManager en cada búsqueda (se puede utilizar el EntityManagerFactory para hacerlo).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top