94 votes

Recherche en texte intégral avec InnoDB

Je suis le développement d'un fort volume de l'application web, où une partie est une base de données MySQL de discussion postes qui devront croître à 20M de lignes, en douceur.

J'avais initialement l'intention de l'utiliser pour les tables MyISAM (pour les haut- fulltext capacités de recherche), mais la pensée de la totalité de la table étant verrouillé en raison d'une seule opération d'écriture me fait de l'obturateur. Les verrous de niveau ligne faire beaucoup plus de sens (pour ne pas mentionner InnoDB autres vitesse avantages lorsque vous traitez avec d'énormes tables). Ainsi, pour cette raison, je suis assez déterminé à utiliser InnoDB.

Le problème, c'est... InnoDB n'a pas intégré de recherche fulltext capacités.

Dois-je aller avec un tiers d'un système de recherche? Comme Lucene(c++) / Sphinx? Ne l'un de vous de la base de données des ninjas avez des suggestions/conseils? LinkedIn est zoie (basé sur Lucene) semble être la meilleure option pour le moment... a été construit autour les capacités en temps réel (ce qui est assez critique pour mon application.) Je suis un peu hésitant à s'engager encore sans connaissance...

(FYI: allez être sur EC2 avec haut-mémoire appareils de forage, à l'aide de PHP pour servir le frontend)

59voto

Jeremy Smyth Points 11001

Ainsi que l'ensemble de la suppression progressive de MyISAM, InnoDB recherche de texte intégral (FTS) est enfin disponible en MySQL 5.6.4 libération.

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

Ces indices sont physiquement représenté par ensemble de tables InnoDB, qui sont mus par des mots-clés SQL tels que le texte intégral de la clause de l'instruction CREATE INDEX, le MATCH() ... par CONTRE la syntaxe d'une instruction SELECT, et la commande OPTIMIZE TABLE.

Tandis que d'autres moteurs ont beaucoup de fonctions différentes, celle-ci est InnoDB, de sorte qu'il est natif (ce qui signifie qu'il y a un chemin de mise à niveau), ce qui en fait une option intéressante.

50voto

Ian Wilkes Points 612

Je peux témoigner de MyISAM fulltext être une mauvaise option - même en laissant de côté les divers problèmes avec les tables MyISAM en général, j'ai vu le texte intégral des trucs de sortir des rails et de commencer à corrompre elle-même et de s'écraser MySQL régulièrement.

Une dédiée au moteur de recherche va certainement être le plus flexible option ici magasin le post de données dans MySQL/innodb, puis exporter le texte de votre moteur de recherche. Vous pouvez configurer une complète périodique de l'indice de créer/publier assez facilement, et d'ajouter en temps réel des mises à jour d'index si vous en ressentez le besoin et l'envie de passer le temps.

Lucene et le Sphinx sont de bonnes options, comme c'est Xapian, ce qui est agréable et léger. Si vous allez à la Lucene route ne présumez pas que Clucene va mieux, même si vous préférez ne pas lutter avec Java, bien que je ne suis pas vraiment qualifié pour discuter les avantages et les inconvénients de l'un ou l'autre.

11voto

Bill Karwin Points 204877

Vous devriez passer une heure et de passer par l'installation et l'essai de Sphinx et de Lucene. Voir si répond à vos besoins, à l'égard des données mises à jour.

L'une des choses qui m'a déçu sur le Sphinx, c'est qu'il ne prend pas en charge différentiels insère très bien. C'est, c'est très cher pour réindexer après une insertion, tellement cher que leur solution recommandée est de répartir vos données en plus, immuable lignes et les plus récentes, la volatilité des lignes. Donc, à chaque recherche de votre app n'aurait à chercher deux fois: une fois sur le plus grand indice de lignes anciennes et aussi sur le plus petit indice pour les dernières lignes. Si ce n'est pas de s'intégrer à vos habitudes d'utilisation, ce Sphinx n'est pas une bonne solution (au moins pas dans son implémentation actuelle).

Je tiens à souligner une autre solution possible vous pourrait envisager: la Recherche Personnalisée Google. Si vous pouvez appliquer un peu de SEO pour votre application web, puis externaliser l'indexation et de la fonction de recherche de Google, et d'intégrer une recherche sur Google textfield dans votre site. Il pourrait être le plus économique et modulable pour faire de votre site à la recherche.

3voto

bobobobo Points 17477

Peut-être vous ne devriez pas faire l'impasse sur MySQL FT si rapidement. Craigslist utilisé pour l'utiliser.

MySQL est la vitesse et de la Recherche Plein Texte a permis de craigslist afin de servir leurs utilisateurs .. craigslist utilise MySQL pour servir d'environ 50 millions de recherches par mois à un taux de jusqu'à 60 recherches par seconde."

modifier

Comme indiqué ci-dessous, Craigslist semble avoir basculé Sphinx au début de 2009.

1voto

Gregg Lind Points 6905

Le sphinx, comme vous l'avez dit, est plutôt bien pour ce genre de choses. Tout le travail est dans le fichier de configuration. Assurez-vous que quelle que soit votre table avec les chaînes possède une clé id unique entière, et tout devrait bien se passer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X