web-dev-qa-db-fra.com

Recherche en texte intégral avec InnoDB

Je développe une application Web volumineuse, comprenant en partie une base de données MySQL de messages de discussion devant atteindre 20 millions de lignes au maximum.

Je prévoyais à l’origine d’utiliser MyISAM pour les tables (pour les capacités de recherche en texte intégral } intégrées), mais je pensais que la table toute la table était verrouillée en raison d’une seule opération d’écriture. Les verrouillages au niveau des lignes ont beaucoup plus de sens (sans parler des autres avantages d'InnoDB en termes de rapidité lorsqu'il s'agit de tables énormes). Donc, pour cette raison, je suis assez déterminé à utiliser InnoDB.

Le problème est que… InnoDB ne dispose pas de fonctionnalités de recherche de texte intégral intégrées.

Devrais-je utiliser un système de recherche tiers? Comme Lucene (c ++) } _/ Sphinx ? Certains de vos ninjas de base de données ont-ils des suggestions/conseils? La zoie } _ de LinkedIn (basée sur Lucene) semble être la meilleure option pour le moment... ayant été construit autour de capacités en temps réel (ce qui est très critique pour mon application), je suis un peu hésitant à m'engager sans avoir la moindre idée ...

(Pour info: va être sur EC2 avec des rigs à haute mémoire, en utilisant PHP pour servir le frontend)

93
brianreavis

Je peux garantir que le texte intégral de MyISAM est une mauvaise option - même en laissant de côté les divers problèmes liés aux tables MyISAM en général, j’ai vu le texte intégral disparaître des Rails et commencer à se corrompre et à planter MySQL régulièrement.

Un moteur de recherche dédié va certainement être l'option la plus flexible ici - stocker les données de publication dans MySQL/innodb, puis exporter le texte vers votre moteur de recherche. Vous pouvez configurer assez facilement une génération/publication complète d'index périodique, et ajouter des mises à jour d'index en temps réel si vous en ressentez le besoin et souhaitez passer le temps.

Lucene et Sphinx sont de bonnes options, tout comme Xapian , ce qui est agréable et léger. Si vous choisissez la voie de Lucene, ne présumez pas que Clucene sera meilleur, même si vous préférez ne pas lutter avec Java, bien que je ne sois pas vraiment qualifié pour discuter des avantages et des inconvénients des deux.

50
Ian Wilkes

Avec la suppression progressive de MyISAM, la recherche de texte intégral InnoDB (FTS) est enfin disponible dans la version 5.6.4 de MySQL.

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

Ces index sont physiquement représentés sous forme de tables InnoDB complètes, sur lesquelles agissent des mots-clés SQL tels que la clause FULLTEXT de l'instruction CREATE INDEX, la syntaxe MATCH () ... AGAINST dans une instruction SELECT et l'instruction OPTIMIZE TABLE.

Alors que d'autres moteurs ont beaucoup de fonctionnalités différentes, celui-ci est InnoDB, il est donc natif (ce qui signifie qu'il existe un chemin de mise à niveau), ce qui en fait une option intéressante.

55
Jeremy Smyth

Vous devriez passer une heure et effectuer l’installation et les essais de Sphinx et de Lucene. Voyez si l'un ou l'autre répond à vos besoins en ce qui concerne les mises à jour de données.

Une des choses qui m'a déçu à propos de Sphinx est qu'il ne prend pas très bien en charge les insertions incrémentielles. C'est-à-dire qu'il est très coûteux de réindexer après une insertion, si coûteux que la solution recommandée consiste à fractionner vos données en lignes plus anciennes et inchangées et en lignes plus récentes et volatiles. Ainsi, chaque recherche effectuée par votre application devra effectuer une recherche deux fois: une fois sur le plus grand index pour les anciennes lignes et également sur le plus petit index pour les lignes récentes. Si cela ne s’intègre pas avec vos habitudes d’utilisation, ce Sphinx n’est pas une bonne solution (du moins dans sa mise en œuvre actuelle).

J'aimerais signaler une autre solution possible que vous pourriez envisager: Recherche personnalisée Google . Si vous pouvez appliquer un peu de référencement à votre application Web, externalisez la fonction d’indexation et de recherche sur Google et intégrez un champ de texte de recherche Google dans votre site. Ce pourrait être le moyen le plus économique et le plus évolutif de rendre votre site consultable. 

11
Bill Karwin

Vous ne devriez peut-être pas rejeter le FT de MySQL si rapidement. Craigslist avait l'habitude de l'utiliser .

La vitesse et la recherche en texte intégral de MySQL ont permis à Craigslist de servir leurs utilisateurs. Craigslist utilise MySQL pour traiter environ 50 millions de recherches par mois, à une cadence pouvant atteindre 60 recherches par seconde. "

modifier

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

3
bobobobo

Le sphinx, comme vous l'avez dit, est assez gentil 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. 

1
Gregg Lind

Si tout le reste échoue, il y a toujours soundex_match , qui malheureusement n'est pas vraiment rapide

0
user1612250

Vous devriez jeter un oeil à Sphinx. Cela vaut la peine d'essayer. Son indexation est super rapide et elle est distribuée. Vous devriez jeter un oeil à ce webminar (http://www.percona.com/webinars/2012-08-22-full-text-search-throwdown). Il parle de recherche et a quelques points de repère intéressants. Vous pouvez le trouver utile.

0
Muhammad

essaye ça

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