2011-05-25 23 views
10

Tengo una consulta que está haciendo ILIKE en unos 11 campos de texto de cadena o texto de la tabla que no es grande (500 000), pero para ILIKE obviamente demasiado grande, la consulta de búsqueda tarda 20 segundos. La base de datos es postgres 8.4Hibernate Search, Lucene o cualquier otra alternativa?

Necesito implementar esta búsqueda para que sea mucho más rápido.

lo que vino a mi mente:

  1. hice columna TVECTOR adicional montado a partir de todas las columnas que necesitan ser buscado, y creó el índice de texto completo en él. La búsqueda de texto completo fue bastante rápida. Pero ... No puedo mapear este tipo de TVECTOR en mi .hbms. Así que esta idea se cayó (en cualquier caso, la consideré más como una solución temporal).

  2. Hibernate la búsqueda. (He oído hablar de ello por primera vez hoy) Parece prometedor, pero necesito una opinión con experiencia sobre él, ya que no quiero entrar en la API nueva, posiblemente no la más simple, para algo que podría hacerse más simple.

  3. Lucene

En cualquier caso, esto ha sucedido ahora con esta tabla, pero me gustaría ser la solución más genérica y se aplica para casos futuros relacionados con las búsquedas de texto completo.

Todos los consejos apreciados!

Gracias

Respuesta

12

Recomiendo encarecidamente Hibernate Search, que proporciona un puente muy fácil de usar entre Hibernate y Lucene. Recuerda que usarás ambos aquí. Simplemente anota propiedades en las clases de tu dominio sobre las que deseas poder buscar. Luego, cuando actualiza/inserta/elimina una entidad habilitada para buscar Hibernate Search, simplemente actualiza los índices relevantes. Esto solo ocurrirá si la transacción en la que se produce el cambio de la base de datos se cometió, es decir, si se revierte, los índices no se romperán.

Así que para responder a sus preguntas:

  1. Sí se puede indexar columnas específicas sobre tablas específicas. También tiene la capacidad de Tokenizar el contenido del campo para que pueda coincidir en partes del campo.

  2. No es difícil de usar en absoluto, simplemente calcula en qué propiedades desea buscar. Dile a Hibernate dónde guardar sus índices. Y luego puede usar las interfaces EntityManager/Session para cargar las entidades que ha buscado.

+0

thanx para explicaciones, una pregunta más breve, quiero poder buscar en algunos campos de cadena. ¿Tiene sentido también almacenar todos los otros campos en el índice, pero no hacer búsquedas, y luego cuando he golpeado, obtengo el objeto a partir de ahí, o debería obtener el IDS e ir a la base de datos para obtenerlos? ? – Julia

+0

@Julia Solo debe indexar los campos en los que desea buscar. Usted le dice a Hibernate Search qué es @DocumentId (también el @Id) de la entidad indexada. Hibernate usará esta identificación para obtener la entidad de la base de datos (o la memoria caché de la sesión) sin que usted se preocupe por ello. En efecto, Hibernate Search toma una cadena de búsqueda y le devuelve las entidades de dominio que coinciden con esa búsqueda. Neat ¿eh? –

+0

bien hecho, gracias! – Julia

0

recomiendo Compass. Es un proyecto de código abierto construido sobre Lucene que proporciona una API más simple (que Lucene). Se integra muy bien con muchas bibliotecas y marcos comunes de Java, como Spring e Hibernate.

0

He utilizado Lucene en el pasado para indexar las tablas de la base de datos. La solución funciona muy bien, pero recuerde que necesita mantener el índice. O bien, actualiza el índice cada vez que persisten sus objetos o tiene un indexador de daemon que vuelca las tablas de la base de datos en su índice Lucene.

¿Has considerado Solr? Está construido sobre Lucene y ofrece indexación automática desde una base de datos y una API de descanso.

+0

thanx. ya usamos lucene para la indexación de documentos, por lo que es mejor que me quede en la misma biblioteca. ¿Cómo sería posible con Lucene, por ejemplo, querer indexar algunas relaciones de objetos? ¿Debo indexar tablas completas, o podría hacer columnas particulares que necesito de la tabla principal y algunas de sus relaciones? – Julia

+0

La forma en que lo hice fue utilizar consultas SELECT con JOINS para crear una estructura "plana" de mis datos para que pudiera ejecutar un indizador sobre ellos. Este es un enfoque. También puede utilizar los procedimientos almacenados para aplanar sus datos en una tabla especial utilizada con fines de indexación –

0

Todos los proyectos se basan en Lucene. Si desea implementar funciones muy avanzadas, le aconsejo que use Lucene directamente. De lo contrario, puede usar Solr, que es una poderosa API sobre lucene que puede ayudarlo a indexar y buscar desde DB.

+0

No necesitaré funciones demasiado avanzadas, creo, pero me gustaría evitar el uso de una nueva biblioteca que no usamos hasta ahora. No estoy seguro de haber entendido por qué recomienda Solr, que en cualquier caso está basado en lucene. ¿Podrías aclarar un poco más, por favor? ¡¡¡Gracias!!! – Julia

+0

Le doy un ejemplo: debe hacer llamadas http a un servidor web. En Java hay una biblioteca de socket que te ayuda a hacer eso, pero hay algo mejor: apache commons http client. Es exactamente que vienen con bibliotecas integradas que implementan el protocolo. Lo mismo para Solr que tiene una API incorporada para administrar índices, búsqueda de texto fácil con una fácil integración de la base de datos y diseñado para ejecutarse en un contenedor de servlets. –

6

Dado que ya está utilizando Hibernate y Lucene, Hibernate Search es una excelente opción.

Lo que Hibernate Search proporcionará principalmente es un mecanismo para actualizar los índices de Lucene cuando se modifican los datos, y la capacidad de maximizar lo que ya sabe sobre Hibernate para simplificar sus búsquedas contra los índices de Lucene.

Podrá especificar qué campos específicos de cada entidad desea indexar, así como agregar varios tipos de índices según sea necesario (por ejemplo, el texto original y completo). También podrá administrar el gráfico de índice para las asociaciones para que pueda realizar consultas bastante complejas a través de Search/Lucene.

He encontrado que lo mejor es confiar en Hibernate Search para las pesadas búsquedas de texto, pero revertir a Hibernate simple antiguo para una búsqueda más tradicional y para hidratar los gráficos de objetos complejos para la visualización de resultados.

0

Hace un año habría recomendado Compass. Fue bueno en lo que hace, y técnicamente sigue felizmente en la aplicación que desarrollé y mantengo.

Sin embargo, no hay más desarrollo en Compass, y los esfuerzos se han cambiado a ElasticSearch. Desde el sitio web de ese proyecto no puedo determinar si está listo para Big Time o incluso si está vivo.

Así que estoy cambiando a Hibernate Search, que no me da una buena sensación pero que la migración todavía está en sus etapas iniciales, así que me reservaré el juicio por un tiempo más.

Cuestiones relacionadas