Requete Mysql AIDE svp !
10 messages • Page 1 sur 1
Consultez la formation au référencement naturel Google de WebRankInfo / Ranking Metrics
Requete Mysql AIDE svp !
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
@+
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
@+
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"
)
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
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"
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
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
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
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
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
Structure de la table si cela peut aider :
- Code: Tout sélectionner
--
-- 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 ;
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...
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...
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
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
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...
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...
10 messages • Page 1 sur 1
Formation recommandée sur ce thème :
Formation Référencement naturel Google : apprenez une méthode efficace pour optimiser à fond le référencement naturel dans Google de façon durable... Formation animée par Olivier Duffez et Fabien Facériès, experts en référencement naturel.
Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.
Lectures recommandées sur ce thème :
- Google API : guide de développement de l'API Google
- Gestion des langues et des sessions en PHP / MySQL
- Nombre moyen de mots par requête : statistiques AOL Août 2006
- Le bêtisier 2008 du site WebRankInfo
- Nombre de clics dans les pages de résultats : statistiques AOL Août 2006
- Passage à l'heure d'été/hiver sur un forum phpBB
- Keyword Search Engine : le choix des bons mots-clés
- Publier un communiqué de presse en ligne gratuitement
- GoogleStats : analyse temps réel des visites de Google sur votre site
- Informations sur l'infrastructure technique de Google
Qui est en ligne
Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités



le forum