used type the support query indexes fulltext full doesn sql mysql search full-text-search innodb

type - search text mysql



Búsqueda de texto completo con InnoDB (8)

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 funciones 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 integradas de búsqueda de texto.

¿Debería ir con un sistema de búsqueda de terceros? Como Lucene(c++) / Sphinx ? ¿Alguno de ustedes ninjas de bases de datos tiene alguna sugerencia / guía? La zoie de LinkedIn (basada en Lucene) parece la mejor opción en este momento ... habiendo sido construido alrededor de las capacidades en tiempo real (lo cual es bastante crítico para mi aplicación). Tengo un poco de duda en comprometerme aún sin una idea ...

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


Debería pasar una hora y pasar por la instalación y prueba de Sphinx y Lucene. Vea si cumple con sus necesidades, con respecto a las actualizaciones de datos.

Una de las cosas que me decepcionó de Sphinx es que no admite insertos incrementales muy bien. Es decir, es muy costoso reindexar después de un inserto, tan caro que su solución recomendada es dividir los datos en filas más antiguas e invariables y en filas nuevas y volátiles. Por lo tanto, cada búsqueda que haga su aplicación tendrá que buscar dos veces: una vez en el índice más grande para las filas anteriores 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 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, externalice la función de indexación y búsqueda a Google e inserte 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 tu sitio se pueda buscar.


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


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

De 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, que son utilizadas por palabras clave de SQL como la cláusula FULLTEXT de la instrucción CREATE INDEX, la sintaxis MATCH () ... CONTRAER en una instrucción SELECT y la instrucción OPTIMIZE TABLE.

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.


Puedo afirmar que el texto completo de MyISAM es una mala opción, incluso dejando de lado los diversos problemas con las tablas MyISAM en general, he visto que todo el texto se ha descarrilado y comienza a corromperse ya bloquear MySQL regularmente.

Un motor de búsqueda dedicado definitivamente va a 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 compilación / publicación periódica completa de índices con bastante facilidad, y agregar actualizaciones de índices 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 ligera. Si vas por la ruta de Lucene, no asumas que Clucene lo hará mejor, incluso si prefieres no luchar con Java, aunque no estoy realmente calificado para discutir los pros y los contras de ninguno de ellos.


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

La velocidad de MySQL y Full Text Search ha permitido que craigslist sirva a sus usuarios. Craigslist utiliza MySQL para atender 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.


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


Sphinx, como dices, es bastante agradable para esto. Todo el trabajo está en el archivo de configuración. Asegúrate de que cualquiera que sea tu tabla con las cadenas tenga alguna clave de identificación entera única, y deberías estar bien.


prueba esto

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