Búsqueda de texto completo con InnoDB


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

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

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

¿Debo ir con un sistema de búsqueda de terceros? Como Lucene (c++) / Sphinx ? ¿Alguno de ustedes, ninjas de la base de datos, tiene alguna sugerencia / guía? LinkedIn zoie (basado en Lucene) parece la mejor opción en este momento ... haber sido construido alrededor de capacidades en tiempo real (que es bastante crítico para mi aplicación.) Estoy un poco indeciso a comprometerme pero sin alguna idea...

(FYI: va a estar en EC2 con plataformas de alta memoria, usando PHP para servir al frontend)

Author: brianreavis, 2009-09-04

8 answers

Puedo dar fe de que MyISAM fulltext es una mala opción - incluso dejando de lado los diversos problemas con las tablas de MyISAM en general, he visto que las cosas de texto completo se descarrilan y comienzan a corromperse y a estrellarse con MySQL regularmente.

Un motor de búsqueda dedicado es definitivamente va a ser la opción más flexible aquí - almacenar los datos post en MySQL/innodb, y luego exportar el texto a su motor de búsqueda. Puede configurar una compilació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 pasar el tiempo.

Lucene y Sphinx son buenas opciones, al igual que Xapian, que es agradable y ligero. Si vas por la ruta de Lucene, no asumas que Clucene mejorará, incluso si prefieres no luchar con Java, aunque no estoy realmente calificado para discutir los pros y los contras de ninguno.

 49
Author: Ian Wilkes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-04 22:50:19

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

Desde http://dev.mysql.com/doc/refman/5.6/en/innodb-table-and-index.html#innodb-fulltext-index:

Estos índices se representan físicamente como tablas InnoDB completas, sobre las que actúan palabras clave SQL como la cláusula FULLTEXT de la instrucción CREATE INDEX, la MATCH() ... CONTRA sintaxis en una instrucción SELECT, y el OPTIMIZAR la INSTRUCCIÓN de LA TABLA.

Mientras que 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.

 54
Author: Jeremy Smyth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-07 09:42:17

Usted debe pasar una hora y pasar por la instalación y la prueba de manejo de la Esfinge y Lucene. Vea si cualquiera de los dos satisface sus necesidades, con respecto a las actualizaciones de datos.

Una de las cosas que me decepcionó de Sphinx es que no soporta inserciones incrementales muy bien. Es decir, es muy caro reindexar después de una inserción, tan caro que su solución recomendada es dividir sus datos en filas más antiguas e inmutables y filas más nuevas y volátiles. Así que cada búsqueda que hace tu aplicación tiene que buscar dos veces: una vez 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, esta Esfinge 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 puedes aplicar algo de SEO a tu aplicación web, subcontrata la función de indexación y búsqueda a Google e inserta una búsqueda de Google textfield en su sitio. Podría ser la forma más económica y escalable de hacer que su sitio se pueda buscar.

 11
Author: Bill Karwin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-04 23:28:47

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

La velocidad de MySQL y la Búsqueda de Texto Completo ha permitido a craigslist servir a sus usuarios .. craigslist utiliza MySQL para servir aproximadamente 50 millones de búsquedas por mes a un ritmo de hasta 60 búsquedas por segundo."

Editar

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

 3
Author: bobobobo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-19 23:45:13

Sphinx, como usted señala, es bastante agradable 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 alguna clave id de entero único, y debería estar bien.

 1
Author: Gregg Lind,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-04 19:48:13

Prueba esto

ROUND((LENGTH(text) - LENGTH(REPLACE(text, 'serchtext', ''))) / LENGTH('serchtext'),0)!=0
 0
Author: Rakesh Ojha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-12 13:39:47

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

 0
Author: Muhammad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-18 17:21:15

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

 0
Author: user1612250,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-18 14:33:24