Page 1 sur 2
Probleme avec like et recherche mot exact
Posté : 28 juil. 2009, 16:07
par desparlsp
Bonjour,
Comment retouver le mot exact d'une requette ?
En effet si j'utilise pour l'exemple la erquete "Ana"
J'ai les resultas suivants;
"
ana"
"b
anane"
"
anaconda"...etc....
Ce qui n'est pas ce que je veux car la recherche ce fait sur un champ comportant plusieurs lignes de textes...
donc apres lecture sur ce froum j'ai fais la chose suivante, mettre des espaces entre la variable et % :
Code : Tout sélectionner
select * from $matable where champ like '% $description[$z] %'
Ca marche partiellement, car le resultat est toujours incorrect. Cette fois ci j'ai :
"
ana" correct
"
anaconda" incorrect.
J'ai essaye avec l'option
et la c'est simple cela donne aucun resultats.
tout comme l'exemple suivant :
J'ai regarder sur le net. Il y auraitune fonction MATCH je crois non?, mais je n'arrive pas a la mettre en oeuvre, c'est un peu confu...
Comment trouver alors un mot exact et pas une approximation ?
Merci pour vos aides
David
Posté : 28 juil. 2009, 16:33
par agité
Tu as essayer avec
SOUNDEX ?
Posté : 28 juil. 2009, 16:43
par enneite
select * from $matable where champ like '$description[$z]' or champ like '% $description[$z] %'' or champ like '% $description[$z]' or champ like 'description[$z] %'
Avec ce code peut être, explications:
la premiere condition = si le champ est égal au terme
la seconde = si le terme est au milieu du champs (un espace avant et un après)
le troisième = s'il est en fin de champ (un espace avant)
le quatrième = s' il est en début (un espace après)
Je n'y arrive pas
Posté : 28 juil. 2009, 17:17
par desparlsp
Salut,
Je ne comprend pas tres bien la fonction SOUND et elle semble un peu sujette a caution et n'etant pas pros je n'arrive pas a la mettre en place...malgre mes recherche sur google en anglais et francais....
Par contre j'ai bien modifie le code en rajoutant le code indiquee ci-dessus et le resultat est le meme.
Si je cherche "ana" j'obtien encore une fois l'exemple suivant :
"ana"
"anaconda" etc..
or je voudrais uniquement chercher et afficher le terme exact, soit ana
merci a vous tous
David
David
Posté : 28 juil. 2009, 17:24
par agité
Si tu veux une recherche exact alors pourquoi ne pas simplement supprimer les joker % ?
Re: Probleme avec like et recherche mot exact
Posté : 28 juil. 2009, 17:24
par Victor BRITO
Il y auraitune fonction MATCH je crois non?
Si, MATCH () AGAINST (), avec MySQL, pour la
recherche en texte intégral.

Toujours pas
Posté : 28 juil. 2009, 17:34
par desparlsp
Salut a nouveau,
decidement ca ne marche pas...
Si je retire les %, c'est simple cela ne me donne aucun resultat. Je ne sais pas pourquoi. Peut etre a cause de la variable $description[$z]???, $z correspondant au nombre de mots si il y en a plusieurs...
En effet, le resultat est toujours 0 donnees trouvees.
Par contre a propos de la fonction Match, je ne sais pas comment la mettre en oeuvre. J'ai lu l'article mais je ne saisi pas bien ce que peu signifier AGAINST.....
Merci
David
Re: Je n'y arrive pas
Posté : 28 juil. 2009, 17:48
par enneite
Salut,
Je ne comprend pas tres bien la fonction SOUND et elle semble un peu sujette a caution et n'etant pas pros je n'arrive pas a la mettre en place...malgre mes recherche sur google en anglais et francais....
Par contre j'ai bien modifie le code en rajoutant le code indiquee ci-dessus et le resultat est le meme.
Si je cherche "ana" j'obtien encore une fois l'exemple suivant :
"ana"
"anaconda" etc..
or je voudrais uniquement chercher et afficher le terme exact, soit ana
merci a vous tous
David
David
Avec le code que je t'ai fourni, on ne peut pas trouver "anaconda"
si on respecte les espaces dans les simples quotes,
select * from $matable where
champ like 'ana'
or champ like '% ana %'
or champ like '% ana'
or champ like 'ana %'
on peut trouver 'ana'
' jhuu ana lijj '
'ana hyuuu'
'rgvfhgyuggh ana'
on ne peut pas trouver 'anaconda' 'anarchiste' 'panama' ...
Re: Toujours pas
Posté : 28 juil. 2009, 18:15
par Victor BRITO
Par contre a propos de la fonction Match, je ne sais pas comment la mettre en oeuvre. J'ai lu l'article mais je ne saisi pas bien ce que peu signifier AGAINST.....

Code : Tout sélectionner
MATCH (colonne1, colonne2...) AGAINST ('expression à rechercher')
Autrement dit, il s'agit de chercher dans la(les) colonne(s) spécifiée(s) dans MATCH () l'expression indiquée dans AGAINST (). Est-ce plus clair ainsi ?

Marche toujours pas
Posté : 28 juil. 2009, 18:26
par desparlsp
Salut,
Desole mais ca ne marche toujours pas. J'ai toujours les meme resultats, pourtant j'ai bien respecte les espaces entre les quotes.
Voila mon morceau de code, peut etre pour mieux comprendre .
Il s'agit d'un petit moteur de recherche.
Code : Tout sélectionner
//met en minuscules le ou les mots trouvés
$mot=strtolower($mot);
//converti les caracteres speciaux en html car ceux ci dans le sont en html
$mot = htmlentities($mot, ENT_QUOTES,'UTF-8');
//met en tableaux plusieur mot saisies
$description=split(" ",$mot);
// NOMBRE D'ELEMENTS DU TABLEAU $description
$nombre_mots=count($description);
//j'initialise la premiere condition si il n'y a qu'un mot recherche
$phrase="'$description[0]' or transcription like '% $description[0] %' or transcription like '% $description[0]' or transcription like '$description[0] %'";
//dans le cadre de plusiers mot je fais une boucle pour la recherche
$z=1;
while($z<$nombre_mots)
{
$phrase.=" or '$description[%z]' or transcription like '% $description[$z] %' or transcription like '% $description[$z]' or transcription like '$description[$z] %' ";
$z++;
}
}
//ensuite j'effectue ma requette
select * from $matable where (transcription like $phrase )
Et la le resultat est le meme. dans mon exemple si je tape
ana j'obtien
"
ana"
"tati
ana" etc...
Par contre dans la fonction MATCH, il s'agit de colonnes, non? Moi il s'agirais plutot de recherche un mot exact dans un texte qui se trouve dans un champ....je ne vois pas ce que ce colonne veut dire...colonne est-ce bien le nom de mon champ????
Excusez mon ignorance....
Merci
David
Re: Marche toujours pas
Posté : 28 juil. 2009, 19:18
par Victor BRITO
Par contre dans la fonction MATCH, il s'agit de colonnes, non? Moi il s'agirais plutot de recherche un mot exact dans un texte qui se trouve dans un champ....je ne vois pas ce que ce colonne veut dire...colonne est-ce bien le nom de mon champ????
Excusez mon ignorance....
Dans une base de données, tu as des
tables qui comportent des
colonnes. Autrement dit, quand tu effectues un
tu sélectionnes les colonnes id, nom et prenom de la table personnes.
Un peu de lecture.

Et pourtant....
Posté : 28 juil. 2009, 19:52
par desparlsp
Salut,
C'est exactement ce que j'ai fait. Pour moi colonne voulait dire champ. Ainsi dans ma table
X il y a une colonne appele
transcription qui contient le texte dont je veux effectuer la recherche d'un mot.
Dans mon cas j'ai fait :
description venant de :
au cas sou il y aurait plusieurs mots.
J'ai essaye avec la fonction Match que tu m'a decrite. Le script ne plante pas et donc semble marcher, mais il ne trouve aucun mot..., exactement comme pour le
like 'mot a chercher' sans les
%....
J'ai cherche sur le net et il semblerait que le probleme soit courant et pas resolu....
David
Posté : 28 juil. 2009, 20:41
par Victor BRITO
D'abord, c'est
sans les %.
Ensuite, avec une telle requête, il faut que la colonne sur laquelle la recherche en texte intégral est effectuée comporte un index FULLTEXT, qui doit reprendre le nom des colonnes évoquées dans MATCH (). Pour ajouter un tel index :
Code : Tout sélectionner
ALTER TABLE nom_de_la_table_concernée ADD FULLTEXT (transcription);
Cela dit, tu peux effectuer ce type de recherche sur une colonne dépourvue d'index FULLTEXT, auquel cas la recherche en texte intégral doit être effectuée en
mode booléen, la requête ressemblant à ça, pour la partie MATCH () AGAINST () :
Code : Tout sélectionner
MATCH (transcription) AGAINST ('$description[0]' IN BOOLEAN MODE)
Desole mais toujours pas ca
Posté : 28 juil. 2009, 23:29
par desparlsp
Salut,
Je suis desole mais cela ne marche pas. J'ai toujours un message d'erreur malgre tout ce qui a ete dit et ce dont j'ai fait. Quand aux exemples concrets sur le net ils sont un peu complexes, flous ou alors pour les pros, ce que je ne suis pas....
Je vais me contenter du like '% $var%', c'est deja mieux que rien.
Merci encore
David
Posté : 29 juil. 2009, 15:05
par enneite
//met en minuscules le ou les mots trouvés
$mot=strtolower($mot);
//converti les caracteres speciaux en html car ceux ci dans le sont en html
$mot = htmlentities($mot, ENT_QUOTES,'UTF-8');
//met en tableaux plusieur mot saisies
$description=split(" ",$mot);
// NOMBRE D'ELEMENTS DU TABLEAU $description
$nombre_mots=count($description);
//j'initialise la premiere condition si il n'y a qu'un mot recherche
$phrase="'$description[0]' or transcription like '% $description[0] %' or transcription like '% $description[0]' or transcription like '$description[0] %'";
//dans le cadre de plusiers mot je fais une boucle pour la recherche
$z=1;
while($z<$nombre_mots)
{
$phrase.=" or '$description[%z]' or transcription like '% $description[$z] %' or transcription like '% $description[$z]' or transcription like '$description[$z] %' ";
$z++;
}
}
//ensuite j'effectue ma requette
select * from $matable where (transcription like $phrase )
Tu veux donc rechercher l'un des termes et non tous les termes.
Tu peux essayer cquelquechose comme ceci :
function separe_mots_dans_chaine($chaine,$echappement)
{
$tableau_mot=array();
$debut_nouveau_mot=0;
$k=0;$i=0;$mot="";
while($i<=strlen($chaine))
{
$caractere=substr($chaine,$i,1);
if ( ($caractere!=$echappement)&& ($i!=strlen($chaine)))
{
$mot=$mot.$caractere;
$i=$i+1;
}
else
{
if($mot!="")
{
$tableau_mot[$k]=$mot;
$k=$k+1;
}
$i=$i+1;
$mot="";
}
}
return $tableau_mot;
}
$tab_mots=separe_mots_dans_chaine($mot," ");
if(count($tab_mots>0)
{
$requete="SELECT * FROM table where ";
for($i=0;$i<count($tab_mots);$i++)
{
$valeur=$tab_mots[$i];
$requete.="( transcription like '$valeur' or transcription like '% $valeur %'
or transcription like '$valeur %' or transcription like ' $valeur%' ) ";
if($i<count($tab_mots)-1) $requete.=" or ";
}
}
tu peux donc essayé cela.
Remarque dans ce cas il recherchera l'un des termes, il faut remplacer le
or par un
and pour qu'il recherche tous les termes.