Souvent pour un moteur de recherches sur un site, on propose à l’utilisateur d’entrer un mot clef que l’on cherchera ensuite dans une base de données pour renvoyer les résultats le contenant. Ce billet, et 2 autres qui le suivront, vont présenter 3 méthodes pour effectuer ce type de recherche, en commençant par l’utilisation de LIKE
. La première méthode pour effectuer une recherche avec Mysql est d’utiliser LIKE
sur un champ texte.
SELECT * FROM table WHERE message LIKE "mot clef";
Cette requête renverra tous les tuples dont le champ message contient exactement la valeur « mot clef », quelque soit la casse. Pour que le résultat dépende de la casse, il faut utiliser LIKE BINARY
:
SELECT * FROM table WHERE message LIKE BINARY "Mot Clef";
Mais LIKE
permet de faire bien plus que cela. Pour recherche le mot « mot clef » qui se trouverait en plein milieu d’une phrase, on va utiliser le pourcentage ( % ). Le pourcentage est un joker qui correspond à « ou ou plusieurs caractères, n’importe lequel » ou à « pas de caractère ».
SELECT * FROM table WHERE message LIKE "%mot clef%";
Par exemple, les phrases : « Bonjour, j’aime ce joli mot clef tout bleu » ou « Salut beau mot clef » seront renvoyé par cette requête. Mais pas « Salut jolis mots clefs ». Dans le même style, on peut utiliser l’underscore ( _ ), c’est un autre joker qui correspond à « un et un seul caractère, n’importe lequel ».
SELECT * FROM table WHERE message LIKE "%mot_ clef_";
Dans ce cas là, la phrase « Salut jolis mots clefs », pourra être renvoyée par cette requête. Pour chercher un underscore ou un pourcentage, il suffit de les faire précéder par un back slash ( \ ).
SELECT * FROM table WHERE message LIKE "\%mot\_ clef";
Recherche le tuple où le champ « message » correspond à « %mot_ clef », quelque soit la casse. Pour préciser un autre caractère d’échappement que le back slash, il suffit de préciser ce caractère en le précédant par ESCAPE
. ça peut toujours servir, qui sait ?
SELECT * FROM table WHERE message LIKE "|%mot|_ clef" ESCAPE "|";
Pour ma part, lorsque je code un moteur de recherche, je travaille souvent par requêtes successives. Par exemple :
SELECT * FROM table WHERE message LIKE "mot clef";
puis
SELECT * FROM table WHERE message LIKE "%mot clef%";
et enfin en remplaçant tous les espaces, tirets, underscores, … par des %
SELECT * FROM table WHERE message LIKE "%mot%clef%";
J’accumule ainsi les différents résultats, en faisant attention aux doublons, (par exemple en rajoutant un NOT IN (liste des ID des tuples déjà sélectionnés)
) et j’obtiens un résultat final classé par ordre de pertinence. Bref, il y a de quoi faire avec cette commande là !
One Response to Mysql et la recherche : avec LIKE