Requete Mysql AIDE svp !

Nouveau WRInaute
Bonjour,

J'ai un annuraire de type pages jaunes. La requete Mysql fonctionne mais est trop précise.

Exemple : Lorsque tape le mot clés "infirmières", il y a 20 réponses.
Avec le mot clé "infirmiers", j'ai 250 réponses.

Comment faire en sorte que lorsque je tape "infirmières", que ca me retourne les 20 réponses mais également les 250 réponses.
En gros, je voudrais que la requete puisse être élargie aux mots qui ressemblent à celui qui a été tapé. (en recherchant "infirmières" que ca me retourne également les réponses correspondant au mot "infirmiers")

Ma requete
$query = "select listid,cid,listname,description,addr,city,state,country,postcode,phone,website ";
$query.="FROM yp_list where (listname like '%$search%' OR description like '%$search%') ";

Merci bcp de votre aide
@+
 
WRInaute impliqué
Bonjour,

tout d'abord avant d'envoyer la requete, tu devrais traiter la chaine "$search" pour :
1 - enlever les espaces en début et fin (avec trim($search); )
2 - remplacer tous les accents par les voyelles non accentuées (rien qu'avec ça ta requete renverrait les résultats pour infimieres et infirmiers si tu tapes la recherche "infirmier" :D )

3 - enfin, si tu veux faire une recherche plus globale tu dois :

a) créer un index fulltext sur ta table myslq pour ton champ 'listname'
b) utiliser une requete de ce style à la place de LIKE :
"SELECT listid, cid, description, addr, city, state, country, postcode, phone, website, MATCH (listname) AGAINST ('$search') as score FROM yp_list WHERE MATCH (listname) AGAINST ('$search') OR description like '%$search%' ORDER BY score DESC";


La documentation Mysql à ce sujet : http://dev.mysql.com/doc/refman/5.0/fr/ ... earch.html
 
Nouveau WRInaute
Bonjour !

Merci beaucoup pour la réponse rapide.

J'ai donc effectué cette requete :
SELECT listid, cid, description, addr, city, state, country, postcode, phone, website, MATCH (listname) AGAINST ( '%infirmieres%' ) as score FROM yp_list WHERE MATCH (listname) AGAINST ( '%infirmieres%' ) OR description like '%infirmieres%' ORDER BY score DESC


MAIS ca me retourne ce message d'erreur : :(
ErrorCan't find FULLTEXT index matching the column list

Et j'ai pourtant fait la requette suivante :
ALTER TABLE `yp_list` ADD INDEX ( `listname` )

Une idée pour résoudre ce pb ?

ET ne faut-il pas altérer également le champ "description". J'aimerai que la recherche soit élargie aussi sur ce champ.

Merci bcp
 
Nouveau WRInaute
Re...
J'ai réussi à mettre du fulltext sur le champ "listname" avec phpmyadmin...

Ca marche mais j'ai toujours 20 réponses pour le mots clés "infirmières"

:(

Une idée ??
 
WRInaute impliqué
Quid des accents ? Tes tables sont elles en UTF-8 ou en latin 1. Comment sont encodés les accents dans ta table ?
 
Nouveau WRInaute
Merci bcp de répondre !

J'ai mis en latin 1.

Et pour les accents, j'avais réglé cela comme cela :

function SansAccents($chaine) {
return( strtr( $chaine,
"ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ",
"AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn" ) );
}
$search = SansAccents($search);


Avant de mettre cette fonction : en tapant "infirmières", j'avais 0 réponses.
Avec ces quelques lignes de codes, j'ai les 20 réponses.

Merci encore
 
Nouveau WRInaute
Structure de la table si cela peut aider :
Code:
-- 
-- Structure de la table `yp_list`
-- 

CREATE TABLE `yp_list` (
  `listid` int(11) NOT NULL auto_increment,
  `cid` int(11) NOT NULL default '0',
  `listname` varchar(255) collate latin1_general_ci NOT NULL,
  `uname` varchar(60) collate latin1_general_ci NOT NULL,
  `description` varchar(255) collate latin1_general_ci NOT NULL,
  `addr` varchar(100) collate latin1_general_ci default NULL,
  `addr2` varchar(100) collate latin1_general_ci default NULL,
  `city` varchar(80) collate latin1_general_ci NOT NULL,
  `state` varchar(50) collate latin1_general_ci default NULL,
  `postcode` varchar(30) collate latin1_general_ci default NULL,
  `country` int(11) NOT NULL default '0',
  `phone` varchar(80) collate latin1_general_ci NOT NULL,
  `tollfree` varchar(100) collate latin1_general_ci default NULL,
  `mobile` varchar(30) collate latin1_general_ci default NULL,
  `fax` varchar(30) collate latin1_general_ci default NULL,
  `email` varchar(200) collate latin1_general_ci default NULL,
  `website` varchar(255) collate latin1_general_ci default NULL,
  `addedon` int(11) NOT NULL default '0',
  `updatedon` int(11) NOT NULL default '0',
  `logo` varchar(40) collate latin1_general_ci default NULL,
  PRIMARY KEY  (`listid`),
  KEY `addedon` (`addedon`),
  KEY `addr` (`addr`),
  KEY `addr2` (`addr2`),
  KEY `cid` (`cid`),
  KEY `city` (`city`),
  KEY `country` (`country`),
  KEY `email` (`email`),
  KEY `fax` (`fax`),
  KEY `listid` (`listid`),
  KEY `logo` (`logo`),
  KEY `mobile` (`mobile`),
  KEY `phone` (`phone`),
  KEY `postcode` (`postcode`),
  KEY `state` (`state`),
  KEY `tollfree` (`tollfree`),
  KEY `uname` (`uname`),
  KEY `updatedon` (`updatedon`),
  KEY `website` (`website`),
  FULLTEXT KEY `listname` (`listname`),
  FULLTEXT KEY `description` (`description`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=46862 ;
 
WRInaute passionné
Hello,

pour les accents et majuscules / minuscules, MySQL s'en charge déjà tout seul en interne. Si cela ne fonctionnait pas chez toi, c'est que tu avais un soucis d'encodage dans ton code ou dans ta base.

Mais évidement il ne se charge pas des conversions masculin/féminin ni singulier/pluriel... ni même des synonymes.
Tout ça, c'est à toi de le prendre en charge...
 
Nouveau WRInaute
Bonjour !
Merci pour la réponse...

"Mais évidement il ne se charge pas des conversions masculin/féminin ni singulier/pluriel... ni même des synonymes"

Comment faire donc ??
Par où je dois chercher pour trouver cela (masculin/féminin ni singulier/pluriel)?

Merci de la réponse
 
WRInaute passionné
Je ne sais pas si des solutions "toutes prêtes" existent, mais je pense que c'est à toi de développer cela avec tes mimines : un système de conversion féminin => masculin (dans la mesure du possible), et de pluriel => singulier (avec des exceptions ?) ainsi qu'un éventuel dictionnaire de synonymes pour proposer des requêtes "proches".

Pour le dico des synonymes, il doit y avoir quelques dico "libres" : voir coté OpenOffice par exemple, je ne sais pas s'ils le sont.

Pour les conversions, bah c'est du français... parmi les trucs tout bete : supprimer le "S" en fin de mot si le mot n'existent pas dans le dictionnaire tel quel.
Prendre en compte les cas de type "cheval" => "chevaux", et les classiques "hiboux", "choux", etc.

Il faudrait sûrement commencer par rechercher des dictionnaires libres je pense.


Une autre solution plus simple, serait de créer une petite table de correspondance gérées "manuellement".
Et de se baser sur les distances levenshtein des mots pour le reste.

Ou encore de faire un mix de tout ça...
 
Discussions similaires
Haut