Problème de recherche sur un index fulltext

Eléphanteau du PHP | 32 Messages

05 janv. 2006, 15:00

Bonjour,

Lorsque je fais une recherche avec match/against, l'instruction ne me ramène aucune donnée.

Code : Tout sélectionner

SELECT * FROM produit WHERE MATCH(nom_produit,lib_produit) AGAINST ('')
J'ai 6 rangées dans ma table "produit".
id_produit id_categ nom_produit lib_produit
1 1 Produit 1 Ceci est le libellé du produit numéro 1
3 1 Produit2 Ceci est le libellé du produit numéro 2
4 2 Produit2_1
5 1 Produit3 Ceci est le libellé du produit numéro 3
6 1 Produit 4 Ceci est le libellé du produit numéro 4
Quelle que soit la chaine de caractère que je renseigne dans mon against, je ne récupère rien.
"MySQL n'a retourné aucun enregistrement. (traitement: 0.0003 sec.)"
Voici le résultat du explain: l'index fulltext est bien utilisé.
1 SIMPLE produit fulltext nom_produit_2 nom_produit_2 0 1 Using where
Quelqu'un aurait-il une idée ?

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

05 janv. 2006, 15:03

Salut,

je pencherais pour la règle des 50% ;)
Si tu cherches une expression qui se trouve dans plus de la moitié des lignes, elle ne sera pas considérée comme significative et donc aucune ligne ne sera renvoyée.
Et vu que tes lignes se ressemblent beaucoup...
La recherche du mot MySQL ne donne aucun résultat dans l'exemple précédent, car il est présent dans plus de la moitié des lignes. Ainsi, il est considéré comme un mot à ignorer (un mot avec une valeur sémantique nulle). C'est le comportement le plus optimal : un langage de requêtes ne doit pas retourner chaque ligne d'une table de 1 Go.

Un mot qui est trouvé dans la moitié des enregistrements d'une table n'est pas efficace pour trouver les document appropriés. En fait, il trouvera sûrement beaucoup de documents inappropriés à la recherche. On sait tous que cela arrive souvent lorsqu'on recherche quelque chose sur internet en utilisant un moteur de recherche. C'est en suivant ce raisonnement que ces lignes se sont vues attribuer une valeur sémantique très basse dans ce cas particulier.

Le seuil de 50% a un impact significatif lorsque vous commencez à comprendre comment fonctionne l'index : si vous créez une table et insérez une ou deux lignes, chaque mot apparaîtra dans 50% des lignes. Résultat, la recherche ne trouvera rien. Assurez-vous d'insérer au moins trois lignes, et même plus.
http://dev.mysql.com/doc/refman/5.0/fr/ ... earch.html

Eléphanteau du PHP | 32 Messages

05 janv. 2006, 15:10

Ca aurait pu etre ca, car je ne connaissais pas cette règle.
Mais je viens d'essayer avec '4', qui ne se se trouve que dans une seule rangée, et il ne me l'a pas trouvée.

Code : Tout sélectionner

SELECT * FROM produit WHERE MATCH(nom_produit,lib_produit) AGAINST ('4')

Mammouth du PHP | 768 Messages

05 janv. 2006, 19:55

Un mot trop court est ignoré. La taille minimale pour un mot dans les recherches est de 4 lettres.

source: http://dev.mysql.com/doc/refman/5.0/fr/ ... earch.html

ps: la taille minimale est modifiable dans le fichier my.ini
M A R I O
Si une patte de lapin porte bonheur, qu'a-t-il bien pu arriver au lapin ?

Eléphanteau du PHP | 32 Messages

05 janv. 2006, 21:11

Merci à vous deux.

Effectivement, en faisant ma recherche sur le mot "Produit3", je le trouve bien.