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)
Respuestas:
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.
fuente
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.
fuente
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.
fuente
Quizás no debería descartar el FT de MySQL tan rápidamente. Craigslist solía usarlo .
editar
Como se comenta a continuación, Craigslist parece haber cambiado a Sphinx en algún momento a principios de 2009.
fuente
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.
fuente
prueba esto
fuente
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.
fuente
Si todo lo demás falla, siempre hay soundex_match , que lamentablemente no es realmente rápido y preciso
fuente
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
products
varias claves e integridad referencial. Luego creé una tabla MyISAM simple llamada queproduct_search
contiene dos campos,product_id
yproduct_name
donde este último se estableció en unFULLTEXT
índice. Ambos campos son efectivamente una copia de lo que está en laproduct
tabla 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.
fuente