Comment puis-je faire une recherche MySQL qui correspondra à des mots partiels mais fournira également un tri précis de la pertinence?
SELECT name, MATCH(name) AGAINST ('math*' IN BOOLEAN MODE) AS relevance
FROM subjects
WHERE MATCH(name) AGAINST ('math*' IN BOOLEAN MODE)
Le problème avec le mode booléen est que la pertinence renvoie toujours 1, donc le tri des résultats n'est pas très bon. Par exemple, si je mets une limite de 5 sur les résultats de recherche, ceux renvoyés ne semblent pas être les plus pertinents parfois.
Si je recherche en mode langage naturel, je comprends que le score de pertinence est utile mais je ne peux pas faire correspondre les mots partiels.
Existe-t-il un moyen d'effectuer une requête qui remplit tous ces critères:
Le meilleur que j'ai obtenu jusqu'à présent est:
SELECT name
FROM subjects
WHERE name LIKE 'mat%'
UNION ALL
SELECT name
FROM subjects
WHERE name LIKE '%mat%' AND name NOT LIKE 'mat%'
Mais je préférerais ne pas utiliser LIKE
.
J'ai obtenu une bonne solution dans cette question (un peu) en double un an plus tard:
MySQL - Comment obtenir des résultats de recherche avec une pertinence précise
La nouvelle fonction de recherche de texte intégral InnoDB dans MySQL 5.6 aide dans ce cas. J'utilise la requête suivante:
SELECT MATCH(column) AGAINST('(Word1* Word2*) ("Word1 Word1")' IN BOOLEAN MODE) score, id, column
FROM table
having score>0
ORDER BY score
DESC limit 10;
où ( )
regroupe les mots dans une sous-expression. Le premier groupe a like Word%
sens; le second cherche la phrase exacte. Le score est renvoyé sous forme de flotteur.