MySQL Cookbook by

Discussion

Pour trouver des enregistrements qui contiennent une phrase particulière, vous ne pouvez pas utiliser une simple FULLTEXTrecherche :

mysql>  -> +----------+| COUNT(*) |+----------+| 548 |+----------+

La requête renvoie un résultat, mais ce n’est pas celui que vous recherchez. Une recherche FULLTEXT calcule un classement de pertinence basé sur la présence de chaque mot individuellement, peu importe où il se trouve dans la colonnevtext, et le classement sera non nul tant que l’un des mots sera présent. Par conséquent, ce type de requête a tendance à trouver trop d’enregistrements.

Depuis MySQL 4.0.2, la recherche FULLTEXT prend en charge la recherche de phrases en mode booléen. Pour l’utiliser, il suffit de placer la phrase entre guillemets doubles.

mysql>  -> +----------+| COUNT(*) |+----------+| 1 |+----------+

Avant la version 4.0.2, une solution de contournement est nécessaire. Vous pourriez utiliser une rechercheIN BOOLEANMODE pour exiger que chaque mot soit présent, mais cela ne résout pas vraiment le problème, car les mots peuvent toujours apparaître dans n’importe quel ordre :

mysql>  ->  -> +----------+| COUNT(*) |+----------+| 3 |+----------+

Si vous utilisez une correspondance de modèle SQL à la place, cela renvoie le résultat correct :

mysql>  -> +----------+| COUNT(*) |+----------+| 1 |+----------+

Mais l’utilisation d’une correspondance de modèle SQL est susceptible d’être plus lente qu’une rechercheFULLTEXT. Il semble donc que vous ayez le choix désagréable d’utiliser une méthode qui est plus rapide mais ne produit pas les résultats souhaités, ou une méthode qui fonctionne correctement mais qui est plus lente. Heureusement, ce ne sont pas vos seules options. Vous pouvez combiner les deux méthodes dans la même requête:

mysql>  ->  -> +----------+| COUNT(*) |+----------+| 1 |+----------+

Ce que vous gagnez, c’est le meilleur des deux types de correspondance:

  • En utilisant l’expression MATCH( ), MySQL peut effectuer une rechercheFULLTEXT pour produire un ensemble de lignes candidates qui contiennent des mots dans la phrase. Cela réduit considérablement la recherche.

  • En utilisant le test de motif SQL, MySQL peut rechercher les lignes candidates pour produire uniquement les enregistrements qui ont tous les mots disposés dans le bon ordre.

Cette technique échouera si tous les mots sont inférieurs à la longueur minimale de mot du moteur d’indexation ou apparaissent dans plus de la moitié des enregistrements. Dans ce cas, la recherche FULLTEXT ne renvoie aucun enregistrement. Vous pouvez trouver les enregistrements en utilisant un modèle de correspondance SQL.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.