web-dev-qa-db-fra.com

MySQL - Recherche efficace avec correspondance partielle de Word et score de pertinence (FULLTEXT)

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:

  • Peut correspondre à des mots partiels
  • Les résultats sont retournés avec une pertinence précise
  • Est efficace

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.

17
BadHorsie

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

3
BadHorsie

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;

( ) 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.

7
Seeghor7