Búsqueda de texto completo con InnoDB

93

Estoy desarrollando una aplicación web de alto volumen, donde parte de ella es una base de datos MySQL de publicaciones de discusión que necesitará crecer a más de 20 millones de filas, sin problemas.

Originalmente estaba planeando usar MyISAM para las tablas (para las capacidades integradas de búsqueda de texto completo ), pero la idea de que toda la tabla esté bloqueada debido a una sola operación de escritura me hace obturar. Los bloqueos a nivel de fila tienen mucho más sentido (sin mencionar las otras ventajas de velocidad de InnoDB cuando se trata de tablas enormes). Entonces, por esta razón, estoy bastante decidido a usar InnoDB.

El problema es ... InnoDB no tiene capacidades de búsqueda de texto completo integradas.

¿Debería optar por un sistema de búsqueda de terceros? ¿Como Lucene (c ++) / Sphinx ? ¿Alguno de los ninjas de la base de datos tiene alguna sugerencia / orientación?Zoie de LinkedIn (basado en Lucene) parece la mejor opción en este momento... habiendo sido construido alrededor de capacidades en tiempo real (lo cual es bastante crítico para mi aplicación). Dudo un poco en comprometerme pero sin una idea ...

(Para su información: estará en EC2 con plataformas de alta memoria, usando PHP para servir la interfaz)

brianreavis
fuente

Respuestas:

50

Puedo dar fe de que el texto completo de MyISAM es una mala opción; incluso dejando de lado los diversos problemas con las tablas de MyISAM en general, he visto que el texto completo se descarrila y comienza a corromperse y a fallar MySQL regularmente.

Un motor de búsqueda dedicado definitivamente será la opción más flexible aquí: almacene los datos de la publicación en MySQL / innodb y luego exporte el texto a su motor de búsqueda. Puede configurar una creación / publicación periódica de índice completo con bastante facilidad y agregar actualizaciones de índice en tiempo real si siente la necesidad y desea dedicar tiempo.

Lucene y Sphinx son buenas opciones, al igual que Xapian , que es agradable y ligero. Si sigue la ruta de Lucene, no asuma que Clucene funcionará mejor, incluso si prefiere no luchar con Java, aunque no estoy realmente calificado para discutir los pros y los contras de ninguno de los dos.

Ian Wilkes
fuente
7
Solr (basado en Lucene) puede escalar enormemente y es muy poderoso y flexible. Hemos empleado Solr (específicamente LucidWorks para la edición de Solr) y puedo decir que ha sido una gran victoria. Sphinx también tiene algunas promesas serias, pero en última instancia, su falta de tipos de datos puede ser preocupante, al menos para nuestra aplicación. Sphinx es muy rápido y, si se adapta a sus necesidades, también es una opción sólida.
Cody Caughlan
Muchas gracias ustedes dos; grandes respuestas. He estado hojeando los documentos de Solr, y parece una gran solución. Veo que también funciona con bastantes sitios web enormes. Creo que Solr es el boleto. Gracias chicos. Además, es bueno saber de tus dolores de cabeza de MyISAM, Ian ... será bueno tenerlos en cuenta en el futuro. En otros proyectos, me desviaré de intentar usar la función de texto completo.
brianreavis
11
¿Se preguntaba qué hizo que Ian dijera "no asumas que Clucene funcionará mejor"? Como miembro del equipo central de Clucene, puede que no sea tan objetivo, pero me parece que el puerto C ++ optimizado de cualquier biblioteca de Java aumentará su rendimiento por las nubes. Recomendaría a cualquiera que no publique tales comentarios sin tener al menos un vistazo al producto que están deshonrando.
synhershko
4
Cuando golpea MyISAM, realmente necesita ser más específico. "Off the rails" es muy vago, y puede haber sido debido a un solo error en la compilación que estaba usando, posiblemente ya corregido.
bobobobo
6
Pero, ¿qué pasa si no tiene la opción de instalar software en el servidor? ¿Qué alternativas existen en este caso?
acme
56

Junto con la eliminación general de MyISAM, la búsqueda de texto completo InnoDB (FTS) finalmente está disponible en la versión de MySQL 5.6.4.

Muchos detalles jugosos en https://dev.mysql.com/doc/refman/5.6/en/innodb-fulltext-index.html .

Si bien otros motores tienen muchas características diferentes, este es InnoDB, por lo que es nativo (lo que significa que hay una ruta de actualización) y eso lo convierte en una opción que vale la pena.

Jeremy Smyth
fuente
1
El enlace del artículo está prohibido 403
Marco Demaio
11

Debería dedicar una hora a la instalación y prueba de manejo de Sphinx y Lucene. Vea si alguno de ellos satisface sus necesidades con respecto a las actualizaciones de datos.

Una de las cosas que me decepcionó de Sphinx es que no admite muy bien las inserciones incrementales. Es decir, es muy caro volver a indexar después de una inserción, tan caro que su solución recomendada es dividir sus datos en filas más antiguas e invariables y filas más nuevas y volátiles. Por lo tanto, cada búsqueda que haga su aplicación tendría que buscar dos veces: una en el índice más grande para las filas antiguas y también en el índice más pequeño para las filas recientes. Si eso no se integra con sus patrones de uso, este Sphinx no es una buena solución (al menos no en su implementación actual).

Me gustaría señalar otra posible solución que podría considerar: Búsqueda personalizada de Google . Si puede aplicar algo de SEO a su aplicación web, subcontrate la función de indexación y búsqueda a Google e incruste un campo de texto de búsqueda de Google en su sitio. Podría ser la forma más económica y escalable de hacer que su sitio se pueda buscar.

Bill Karwin
fuente
Gracias, Bill. Sí, la documentación de Sphinx me hizo vacilar un poco sobre cómo maneja las actualizaciones del índice. Es bueno tenerlo confirmado. Ese tipo de sistema probablemente se convertiría en una pesadilla para mí, imagino. En cuanto a la búsqueda personalizada de Google, esa es una opción. Sin embargo, mi principal problema con eso es solo el índice que no es en tiempo real y la falta de personalización. Diseñar los resultados y extraer datos adicionales será crucial para mí. Sin embargo, gracias por intervenir --- ¡Es bueno saber la información de la Esfinge!
brianreavis
3

Quizás no debería descartar el FT de MySQL tan rápidamente. Craigslist solía usarlo .

La velocidad de MySQL y la búsqueda de texto completo han permitido que craigslist sirva a sus usuarios ... craigslist utiliza MySQL para ofrecer aproximadamente 50 millones de búsquedas por mes a una velocidad de hasta 60 búsquedas por segundo ".

editar

Como se comenta a continuación, Craigslist parece haber cambiado a Sphinx en algún momento a principios de 2009.

bobobobo
fuente
El artículo que vinculé no menciona a Sphinx, y Nik no cita ninguna fuente que diga que Craigslist usa Sphinx en absoluto
bobobobo
El PDF del estudio de caso se parece a 2004, momento en el que se realizaron 50 millones de búsquedas por mes. La página Sphinx indica 50 millones de búsquedas por día , lo que probablemente explica la razón por la que cambiaron a una solución de búsqueda dedicada.
Halil Özgür
1

Sphinx, como señala, es bastante bueno para estas cosas. Todo el trabajo está en el archivo de configuración. Asegúrese de que cualquiera que sea su tabla con las cadenas tenga una clave de identificación entera única, y debería estar bien.

Gregg Lind
fuente
0

prueba esto

ROUND((LENGTH(text) - LENGTH(REPLACE(text, 'serchtext', ''))) / LENGTH('serchtext'),0)!=0
Rakesh Ojha
fuente
0

Deberías echarle un vistazo a Sphinx. Vale la pena intentarlo. Su indexación es súper rápida y se distribuye. Debería echar un vistazo a este seminario web (http://www.percona.com/webinars/2012-08-22-full-text-search-throwdown). Habla de búsqueda y tiene algunos puntos de referencia interesantes. Puede resultarle útil.

Mahoma
fuente
0

Si todo lo demás falla, siempre hay soundex_match , que lamentablemente no es realmente rápido y preciso

user1612250
fuente
0

Para cualquiera atascado en una versión anterior de MySQL / MariaDB (es decir, usuarios de CentOS) donde InnoDB no admite búsquedas de texto completo, mi solución al usar tablas InnoDB fue crear una tabla MyISAM separada para lo que quería buscar.

Por ejemplo, mi tabla principal de InnoDB tenía productsvarias claves e integridad referencial. Luego creé una tabla MyISAM simple llamada que product_searchcontiene dos campos, product_idy product_namedonde este último se estableció en un FULLTEXTíndice. Ambos campos son efectivamente una copia de lo que está en la producttabla principal .

Luego busco en la tabla MyISAM usando texto completo y realizo una combinación interna de regreso a la tabla InnoDB.

El contenido de la tabla MyISAM se puede mantener actualizado mediante desencadenadores o el modelo de la aplicación.

No recomendaría esto si tiene varias tablas que requieren texto completo, pero para una sola tabla parece una solución adecuada hasta que pueda actualizar.

MrCarrot
fuente