2011-08-23 10 views
5

Tengo una base de datos mysql donde se agregan constantemente grandes cantidades de texto. (10 páginas de texto por hora). El texto se almacena como texto sin formato en los campos de texto. Cada fila entra en contacto con una o dos páginas de texto.Buscar grandes cantidades de texto constantemente actualizado en mysql

Necesito hacer una búsqueda de texto completo (buscar una palabra clave en el texto y hacer consultas complejas) en esta base de datos de forma regular. Solo necesito buscar texto recién agregado. Pero es muy importante que el texto agregado pueda buscarse de inmediato (en un minuto o dos).

Por lo que he leído, el texto completo con mysql es muy ineficiente. Sé que lucene es una opción, pero aún no estoy seguro de qué tan rápido pueda indexar texto nuevo.

¿Cuáles son mis opciones? ¿Hay alguna manera de hacer que mysql sea más eficiente? lucene es mi mejor solución? algo más apropiado?

gracias

Respuesta

2

He hecho benchmarking para Indexing Times para Sphinx & Solr. Sphinx está muy por delante en comparación con Solr con respecto a los algoritmos de indexación (tiempos de indexación súper rápidos y tamaño de índice pequeño).

Cuando dices 10 páginas de texto, parece que incluso no necesitas indexación Sphinx en tiempo real. Puede seguir el esquema de indexación principal + delta en Sphinx (puede encontrarlo en la Documentación de Sphinx). Sería súper rápido y casi en tiempo real. Si desea obtener más ayuda sobre este tema, no dude en preguntar, estaría encantado de explicarle.

Solr es genial, pero cuando se trata de algoritmos optimizados, Sphinx rocks !! Prueba Sphinx.

Respondiendo a sus preguntas en el comentario, Solr/Lucene admite la indexación incremental (conocida como importación delta en su terminología) y es silenciosamente fácil de configurar, pero son bastante lentas en comparación con el método utilizado por Sphinx.

Main + Delta es lo suficientemente rápido porque lo que puedes hacer es crear una tabla temporal almacenar el texto nuevo e indexar eso. De acuerdo con la documentación: Sphinx admite actualizaciones de índice "en vivo" (casi en tiempo real) y podría implementarse usando denominado esquema "main + delta".La idea es establecer dos fuentes y dos índices, con un índice "principal" para los datos y un "delta" para los nuevos documentos.

Digamos, por ejemplo, que tiene 10 millones de registros, así que puede mantener eso ya que el índice principal y todos los nuevos documentos se agregan a una nueva tabla que actuará como delta. Esta nueva tabla se puede indexar de vez en cuando (digamos cada 1 hora) y los datos se pueden buscar en pocos segundos, ya que tiene 10 páginas de texto. Ahora, después de buscar sus nuevos registros, puede combinar los documentos de la tabla principal + tabla delta que pueden llevarse a cabo sin interferir con su búsqueda. Cuando se combinan los documentos, vacíe la nueva tabla y nuevamente después de una hora puede volver a realizar todo el proceso. Espero que tengas eso, por favor no dudes en hacerme cualquier pregunta.

+0

Gracias por su ayuda. De lo que leo main + delta es exactamente lo que necesito. Pero hay un punto que no está claro en el documento; dicen que reducirá el tiempo de indexación a 30 a 60 segundos. En mi caso, es fundamental tener un nuevo texto listo para ser buscado en segundos (máximo un minuto). ¿Main + delta es lo suficientemente rápido? Por lo que veo, Sphinx es ese camino por recorrer. – applechief

+0

Usted es bienvenido. Puedes ver mi respuesta editada arriba. Main + Delta debería funcionar bien para usted porque la indexación de Sphinx es realmente muy rápida. Sin embargo, una cosa más: por favor, también eche un vistazo a los índices en tiempo real en Sphinx como se menciona en una de las respuestas anteriores, nunca lo he usado pero parece prometedor. Después de aplicar ambos a sus datos, puede verificar qué funciona mejor para usted. – Yavar

2

usted tiene un par de opciones:

  • Sphinx Search: Se puede integrar directamente con su base de datos MySQL. Tiene soporte para índices en tiempo real, con limitaciones

  • Solr/Lucene: aliméntelo a través de JSON o XML desde su base de datos. Tiene amplias capacidades de consulta. Las versiones actuales no son en tiempo real sin algunas versiones de borde. Debe volver a indexar sus datos y confirmarlos para que aparezcan los cambios. Que dependiendo de tu cantidad de datos, puedes hacer un commit cada 10 min. Esto no será un problema hasta que tengas documentos 100K/1M + ya que Lucene es muy rápido en la indexación. 10 páginas/hora es bastante trivial.

  • ElasticSearch: Está basado en Java como Solr/Lucene, pero parece ser el verdadero "tiempo casi real" suficiente. Diseñado fuera de la caja para ser distribuido y compatible con escalado lineal. Usted alimenta los datos a través de JSON y consultas a través de JSON.

Realmente depende de sus necesidades y capacidades. Sphinx podría ser el más fácil de comenzar. Pero sus limitaciones de índice en tiempo real podrían no funcionar para usted.

+0

Sphinx y ElasticSearch parecen interesantes. Voy a investigar las limitaciones de tiempo real de la esfinge. Entonces, lucene reindexa toda la base de datos todo el tiempo? ¿No hace actualizaciones incrementales a su índice? ¿Qué pasa con shinx y elasticsearch? – applechief

+0

1. ElasticSearch también se basa en Lucene 2. Lucene puede agregar documentos a medida que aparecen nuevamente, por lo que NO DEBE reindexar nada, pero @Code significaba que necesitaría alimentar los documentos y llamar a la costosa operación 'commit' relativa para que aparecen los documentos, esto solo es válido para Solr. Lucene y ElasticSearch no necesitan el costoso 'commit' 3. ElasticSearch es muy fácil de empezar también ... – Karussell

Cuestiones relacionadas