Comment trier fulltext MYSQL résultats de recherche par ordre de pertinence
Je suis relativement nouveau à MYSQL et ont eu un problème qui a été mise sur écoute de moi pendant un moment. J'ai essayé de googler tous sur la place pour la réponse, mais n'avons pas réussi à trouver une solution acceptable pour l'instant.
Voici la requête que je suis en cours d'exécution actuellement pour trouver la meilleure correspondance possible pour un terme de recherche donné:
$query="SELECT * from `vocabulary` WHERE translation = 'word' OR translation LIKE '%word%'";
Les résultats, il renvoie sont complets en ce qu'elles comprennent toutes les lignes. Cependant, ils ne sont pas triés dans un ordre particulier, et je voudrais avoir ceux avec une correspondance exacte qui apparaît en premier lorsque j'ai des résultats d'impression en PHP. Comme ceci:
1 | mot <-correspondance exacte
2 | mots croisés <- les correspondances partielles triés par ordre alphabétique /
3 | les mots
4 | wordsmith
Merci beaucoup d'avance pour votre aide.
-macspacejunkie
- Mise à JOUR: Merci à vous tous pour l'aide! Juste ce que je cherchais. Cordialement, -macspacejunkie
- si quelqu'un vous a aidé, merci de vérifier leur réponse
Vous devez vous connecter pour publier un commentaire.
liste de correspondances exactes première
FULLTEXT
de la recherche pour beaucoup plus rapidement les requêtesAIME n'est pas recherche de texte intégral. En recherche Fulltext,
MATCH(...) AGAINST(...)
renvoie un score d'appariement qui peut être grossièrement approchée par ordre de pertinence.Vous pouvez obtenir une bonne pertinence de la recherche par la création d'un index de texte intégral et puis le rapprochement avec votre terme de recherche.
Donc quelque chose comme cela devrait fonctionner.
Plus d'informations peuvent être trouvées dans le Manuel De Référence De MySQL.
J'ai été regardant le même problème et pas tout à fait trouvé la réponse parfaite pour ma situation, mais cela peut être utile pour vous. Je suis assez nouveau à la recherche plein texte aussi si tous les experts de m'aider trop.
Je fais deux MATCH() CONTRE() les déclarations de la sélectionner et de combiner les score de chaque pour former le total de la pertinence. L'affectation de différents multiplicateurs me permet de configurer l'importnace de chaque ensemble de résultats.
Mon premier MATCH() serait de vérifier contre le littéral (ou exact) terme de recherche à l'aide de guillemets doubles
Mon deuxième MATCH serait de vérifier normalement. J'applique un multiplicateur supérieur pour le premier match, donc il devrait avoir un plus à la pertinence de la valeur s'il est trouvé.
Quelque chose comme ça.
Si vous exécutez l'utilisation de l'EXPLIQUER en fonction de montrer comment la requête fonctionne, vous devriez trouver que le supplément de MATCH() CONTRE() clauses ne fait ajouter des frais généraux de la requête en raison de la façon dont MySQL fonctionne.
Votre requête n'a besoin que de peu de modification pour obtenir l'ordre que vous cherchez.
Si
translation
est exactement'word'
, il sera en haut des résultats. C'est parce quetranslation <> 'word'
sera 0 quand il y a un correspondance exacte qui vient avant le 1 qui sera retournée pour tous les autres résultats. Les autres résultats sont triés par ordre alphabétique, après que, en raison de la, translation
.Cette requête évite de faire deux requêtes comme la réponse choisie n'est avec son
UNION
. En outre, votre requête n'a pas besointranslation = 'word' OR translation LIKE '%word%'
depuis le second semestre sera toujours exécutée et est un sur-ensemble de la première partie.Pour ceux qui recherchent une réponse qui utilise un réelle de recherche de texte intégral, veuillez consulter les autres, plus fortement upvoted réponses.