Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Installation
Installation Forum d'entraide sur les problèmes liés à l'installation de MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/09/2007, 17h14   #1
Membre Expert
 
Développeur informatique
Inscription : juillet 2007
Messages : 690
Détails du profil
Informations personnelles :
Âge : 28
Localisation : Canada

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : juillet 2007
Messages : 690
Points : 1 558
Points : 1 558
Par défaut MATCH() AGAINST(), un cas bizarre !

Bonjour,
Un beau petit cas pour vous
Je fait une requete de recherche dans un champ text :

Code :
1
2
3
SELECT * 
FROM matable 
WHERE MATCH(MonChampText) AGAINST ('momo*' IN BOOLEAN MODE);
La requête donne de bons résultats

Un client m'appele aujourd'hui pour me dire que son livre : momo bibi machinchose n'apparait pas dans le moteur de recherche du site quand on tape 'momo', et effectivement lorsqu'on fait un match against ('momo*') on a pas des resultats de match against ('momo* bibi*').
Alors ma question : POURKOI !!!!!

Merci à l'avance
ygrim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/09/2007, 22h48   #2
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
Citation:
Envoyé par ygrim Voir le message
et effectivement lorsqu'on fait un match against ('momo*') on a pas des resultats de match against ('momo* bibi*').
Alors ma question : POURKOI !!!!!
Parce que ça ne marche qu'avec IN BOOLEAN MODE.
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/09/2007, 23h03   #3
Membre Expert
 
Développeur informatique
Inscription : juillet 2007
Messages : 690
Détails du profil
Informations personnelles :
Âge : 28
Localisation : Canada

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : juillet 2007
Messages : 690
Points : 1 558
Points : 1 558
Je ne comprends pas

Code :
1
2
3
SELECT * 
FROM matable 
WHERE MATCH(MonChampText) AGAINST ('momo*' IN BOOLEAN MODE);
Code :
1
2
3
SELECT * 
FROM matable 
WHERE MATCH(MonChampText) AGAINST ('momo* bibi*' IN BOOLEAN MODE);
Les deux requêtes sont IN BOOLEAN MODE, tu veux dire que quand c'est comme ça, c'est normal que les résultats de la 2eme requetes ne soient pas inclus dans les résultats de la première ?
ygrim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/09/2007, 23h20   #4
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
non, je veux dire que tu dis

Citation:
on a pas des resultats de match against ('momo* bibi*')
et qu'il y manque le IN BOOLEAN MODE.

Si c'est juste un oubli dans ton message, merci de poster tes données afin qu'on puisse tester.
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/09/2007, 20h10   #5
Membre Expert
 
Développeur informatique
Inscription : juillet 2007
Messages : 690
Détails du profil
Informations personnelles :
Âge : 28
Localisation : Canada

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : juillet 2007
Messages : 690
Points : 1 558
Points : 1 558
Bon, j'ai avancé dans mon problème un peu :
voila ma requete avec un mot :
Code :
1
2
3
4
5
6
 
SELECT DISTINCT p.code_produit,titre,AUTEUR,NOM_EDITEUR,CODE_BARRE,DATE_PARUTION,PRIX_VENTE,DISPONIBILITE, MediaFileLink,f.code_produit AS fiche
FROM (prod_general p,prod_stock)
LEFT JOIN prod_medias m ON m.code_produit=p.code_produit
LEFT JOIN prod_fiches f ON f.code_produit=p.code_produit
WHERE p.code_produit = prod_stock.code_produit AND (m.MediaFileLink IS NULL OR m.thumbnail='y') AND MATCH(p.titre_SA) AGAINST('ours*' IN BOOLEAN MODE) ORDER BY TITRE ASC LIMIT 0,100;
Et ma requête avec deux mots
Code :
1
2
3
4
5
6
 
SELECT DISTINCT p.code_produit,titre,AUTEUR,NOM_EDITEUR,CODE_BARRE,DATE_PARUTION,PRIX_VENTE,DISPONIBILITE, MediaFileLink,f.code_produit AS fiche
FROM (prod_general p,prod_stock)
LEFT JOIN prod_medias m ON m.code_produit=p.code_produit
LEFT JOIN prod_fiches f ON f.code_produit=p.code_produit
WHERE p.code_produit = prod_stock.code_produit AND (m.MediaFileLink IS NULL OR m.thumbnail='y') AND MATCH(p.titre_SA) AGAINST('ours brun*' IN BOOLEAN MODE) ORDER BY TITRE ASC LIMIT 0,100;
Je joins les résultats en fichier attaché (résp explain.sql et explqin2.sql).

Lorsqu'on remplace MATCH par LIKE, les résultats sont tous la mais au prix d'une ennorme perte de performance (c'est des grosses tables que j'ai).

Lorsq'on recherche ours brun* on a des résultats que l'on a pas dans une recherche avec ours

Merci
Fichiers attachés
Type de fichier : sql explain.sql (5,7 Ko, 2 affichages)
Type de fichier : sql explain2.sql (3,8 Ko, 2 affichages)
ygrim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/09/2007, 21h22   #6
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
1/ ta table est-elle bien en MyISAM ? 2/ as-tu bien mis un index FULLTEXT
Code :
CREATE fulltext INDEX ft_titre  ON p(titre)
3/ d'après tes données, il me semble que 'ours* brun' correspond plus à ce que tu attends que 'ours brun*'
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/09/2007, 22h45   #7
Membre Expert
 
Développeur informatique
Inscription : juillet 2007
Messages : 690
Détails du profil
Informations personnelles :
Âge : 28
Localisation : Canada

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : juillet 2007
Messages : 690
Points : 1 558
Points : 1 558
Citation:
Envoyé par Antoun Voir le message
1/ ta table est-elle bien en MyISAM ? 2/ as-tu bien mis un index FULLTEXT
Code :
CREATE fulltext INDEX ft_titre  ON p(titre)
3/ d'après tes données, il me semble que 'ours* brun' correspond plus à ce que tu attends que 'ours brun*'
oui mes tables sont en MyIsam, oui les index sont en fulltext et oui tu as raison je cherche plus ours* brun

Dire que tous ces oui ne résolvent pas mon problème
ygrim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2007, 14h50   #8
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
Qu'obtiens-tu, et que souhaiterais-tu obtenir ?
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/09/2007, 15h31   #9
Membre Expert
 
Développeur informatique
Inscription : juillet 2007
Messages : 690
Détails du profil
Informations personnelles :
Âge : 28
Localisation : Canada

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : juillet 2007
Messages : 690
Points : 1 558
Points : 1 558
J'obtiens le fait que les résultats de recherche avec "mot1 mot2" ne soient pas inclus dans les résultats de recherche avec "mot1" seulement.
Et ce que je veux obtenir .... ben que les résultats de "mot1 mot2" soient inclus dans les résultats de "mot1", en utilisant MATCH () AGAINST ()
ygrim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/09/2007, 23h14   #10
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
dans tes données la requête suivante :

Code :
1
2
3
SELECT titre
FROM p
WHERE match(titre) against('ours* brun' IN BOOLEAN mode)
me donne L'amant de la grande ourse, L'Ourse bleue, aussi bien que toutes les histoires d'ours brun. Attention, les résultats ne sont pas triés par pertinence.
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/09/2007, 17h22   #11
Membre Expert
 
Développeur informatique
Inscription : juillet 2007
Messages : 690
Détails du profil
Informations personnelles :
Âge : 28
Localisation : Canada

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : juillet 2007
Messages : 690
Points : 1 558
Points : 1 558
Citation:
Envoyé par Antoun Voir le message
dans tes données la requête suivante :

Code :
1
2
3
SELECT titre
FROM p
WHERE match(titre) against('ours* brun' IN BOOLEAN mode)
me donne L'amant de la grande ourse, L'Ourse bleue, aussi bien que toutes les histoires d'ours brun. Attention, les résultats ne sont pas triés par pertinence.
Oui mais
Code :
1
2
3
SELECT titre
FROM p
WHERE match(titre) against('ours*' IN BOOLEAN mode)
ne donnent pas ces résultats d'ours brun, et c'est àa mon problème !
ygrim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/09/2007, 22h15   #12
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
Ours est un "stopword", càd un mot ignoré par par la recherche FULLTEXT (liste des stopwords dans la doc, chap 12.8.3). Donc tu pourras trouver ourson, ourse, etc., mais pas ours. Donc 'ours* brun' repêche les Ours bruns parce qu'ils contiennent "brun", mais 'ours*'ne peut pas les trouver.
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2007, 15h42   #13
Membre Expert
 
Développeur informatique
Inscription : juillet 2007
Messages : 690
Détails du profil
Informations personnelles :
Âge : 28
Localisation : Canada

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : juillet 2007
Messages : 690
Points : 1 558
Points : 1 558
Merci infiniment !
C'est effectivement ça le problème !!
Maintenant reste à trouver la solution

Je vous tiens au courant !
ygrim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2007, 17h38   #14
Membre Expert
 
Développeur informatique
Inscription : juillet 2007
Messages : 690
Détails du profil
Informations personnelles :
Âge : 28
Localisation : Canada

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : juillet 2007
Messages : 690
Points : 1 558
Points : 1 558
Pour cloturer définitvement !
On peux configurer mysql pour qu'il prenne en charge une liste de stopwords personnalisée, il suffit juste d'éditer my.cnf et d'y ajouter (ou modifier) la valeur de la variable ft_stopword_file :
Code :
ft_stop_word_file = /chemin/vers/stopwordfile.txt
On redémarre le serveur mysql

On regénère les index :
Code :
REPAIR TABLE nom_de_table EXTENDED
(ça prend du temps)

Et voila !

Merci beaucoup pour ton aide précieuse antoun
ygrim est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h45.


 
 
 
 
Partenaires

Hébergement Web