Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment puis-je manipuler la pertinence de la recherche en texte intégral MySQL pour rendre un champ plus "précieux" qu'un autre ?

Créer trois index de texte intégral

  • a) un dans la colonne des mots clés
  • b) un sur la colonne de contenu
  • c) un sur les colonnes de mots clés et de contenu

Ensuite, votre requête :

SELECT id, keyword, content,
  MATCH (keyword) AGAINST ('watermelon') AS rel1,
  MATCH (content) AGAINST ('watermelon') AS rel2
FROM table
WHERE MATCH (keyword,content) AGAINST ('watermelon')
ORDER BY (rel1*1.5)+(rel2) DESC

Le fait est que rel1 vous donne la pertinence de votre requête juste dans le keyword colonne (parce que vous avez créé l'index uniquement sur cette colonne). rel2 fait la même chose, mais pour le content colonne. Vous pouvez maintenant additionner ces deux scores de pertinence en appliquant la pondération de votre choix.

Cependant, vous n'utilisez aucun de ces deux index pour la recherche proprement dite. Pour cela, vous utilisez votre troisième index, qui se trouve sur les deux colonnes.

L'index sur (mot clé, contenu) contrôle votre rappel. Aka, ce qui est retourné.

Les deux index distincts (un sur les mots clés uniquement, l'autre sur le contenu uniquement) contrôlent votre pertinence. Et vous pouvez appliquer vos propres critères de pondération ici.

Notez que vous pouvez utiliser n'importe quel nombre d'index différents (ou varier les index et les pondérations que vous utilisez au moment de la requête en fonction d'autres facteurs peut-être ... ne recherchez que par mot-clé si la requête contient un mot vide ... diminuez le biais de pondération pour mots-clés si la requête contient plus de 3 mots ... etc).

Chaque index utilise de l'espace disque, donc plus d'index, plus de disque. Et à son tour, une empreinte mémoire plus élevée pour mysql. De plus, les insertions prendront plus de temps, car vous avez plus d'index à mettre à jour.

Vous devez évaluer les performances (en prenant soin de désactiver le cache de requêtes mysql pour l'analyse comparative, sinon vos résultats seront faussés) pour votre situation. Ce n'est pas efficace pour Google, mais c'est assez facile et "prêt à l'emploi" et c'est presque certainement beaucoup mieux que votre utilisation de "comme" dans les requêtes.

Je trouve que ça marche vraiment bien.