2010-03-30 5 views
2

J'utilise MySQL InnoDB et je veux faire des recherches de style de texte intégral sur certaines colonnes. Quelle est la meilleure façon de trier les résultats par ordre de pertinence?Le tri de pertinence de remplacement pour le fulltext MySQL dans les tables InnoDB?

Je suis en train de faire quelque chose comme:

SELECT columns, 
(LENGTH(column_name) - LENGTH(REPLACE(column_name, '%searchterm%', ''))) AS score 
FROM table 
WHERE column_name LIKE '%searchterm%' 
ORDER BY score 

Cependant, cela deviendra assez compliqué une fois que je commence à chercher plus de 1 colonne ou en utilisant plus d'un mot-clé. J'ai déjà plusieurs jointures, donc j'ai simplifié la requête ci-dessus.

Quelqu'un peut-il suggérer un meilleur moyen? Je ne veux pas utiliser un logiciel tiers comme Sphinx etc

Répondre

1

Je prendrais Sphinx ou Solr. Les deux ont de meilleurs fts que MyISAM et peuvent aussi travailler pour vous innoDB-tables.

+0

Merci, mais j'espérais trouver une sorte de méthode sans avoir à utiliser sphinx de sol –

+0

Toutes les alternatives raisonnables ont été trop lent ou trop imprécis. On dirait que je vais devoir essayer Sphinx, Merci –

3

Si vous ne souhaitez pas utiliser un autre moteur, vous pouvez créer une copie MyISAM "shadow" de votre table InnoDB et exécuter les recherches de texte intégral par rapport à cela. Avec certains déclencheurs appropriés sur la table InnoDB, vous pouvez mettre à jour la copie MyISAM relativement facile. Et pour éviter que l'enregistrement InnoDB n'ait disparu, faites une jointure contre la table InnoDB. Quelque chose comme:

SELECT MATCH(myisamtable.field1, myisamtable.field2, myisamtable.field3) 
     AGAINST ('search terms') AS relevance, 
    mysitamtable.field1, myisamtable.field2, myisamtable.field3 
FROM myistamtable 
RIGHT JOIN innodbtable ON myistamtable.commonID = innodbtable.commonID 
WHERE (innodbtable.commonID IS NOT NULL) AND (MATCH(myisamtable.field1, myisamtable.field2, myisamtable.field3) AGAINST ('search terms') IN BOOLEAN MODE) 
ORDER BY relevance DESC; 
+0

Merci, cela a bien fonctionné, mais pour le volume de données que j'ai (40+ Gb), c'était trop lent une fois que j'avais rejoint d'autres tables. On dirait que je vais devoir utiliser quelque chose comme Sphinx. –

1

MySQL 5.6 (actuellement en version bêta, au Avril 2012), les index FULLTEXT sont autorisés pour les tables InnoDB, vous pouvez utiliser la syntaxe de recherche familière ISAM avec les transactions InnoDB, jointures, clés étrangères, etc. Pour plus de liens, voir this related StackOverflow question.

Questions connexes