FULLTEXT dans mysql
11 messages
• Page 1 sur 1
Consultez la formation à Google Analytics de WebRankInfo / Ranking Metrics
- caro
- WRInaute impliqué

- Messages: 871
- Inscription: 21 Juil 2003
FULLTEXT dans mysql
Salut les gars,
J'aimerais que vous me donniez votre avis sur une fonction mysql.
infos nécessaires :
- bdd contenant 5000 enregistrements
- un champs varchar nommé "nom" contenant 3 à 5 noms seulement
Je veux faire une recherche sur un "nom":
1) je peux pas utiliser WHERE nom='dupond' car le champs "nom" contient plusieurs noms
2) je veux pas utiliser WHERE nom LIKE '%dupond%' car retourne aussi noms tels que "aduponde" ou "dupondus" ...
3) j'ai pensé faire une recherche en FULLTEXT avec WHERE MATCH (nom) AGAINST ('dupond') ;
mais la fonction FULLTEXT n'est elle pas trop gourmande ?
est ce que j'utilise la bonne solution ?
merci beaucoup pour votre aide
carole
J'aimerais que vous me donniez votre avis sur une fonction mysql.
infos nécessaires :
- bdd contenant 5000 enregistrements
- un champs varchar nommé "nom" contenant 3 à 5 noms seulement
Je veux faire une recherche sur un "nom":
1) je peux pas utiliser WHERE nom='dupond' car le champs "nom" contient plusieurs noms
2) je veux pas utiliser WHERE nom LIKE '%dupond%' car retourne aussi noms tels que "aduponde" ou "dupondus" ...
3) j'ai pensé faire une recherche en FULLTEXT avec WHERE MATCH (nom) AGAINST ('dupond') ;
mais la fonction FULLTEXT n'est elle pas trop gourmande ?
est ce que j'utilise la bonne solution ?
merci beaucoup pour votre aide
carole
-

itsme - WRInaute impliqué

- Messages: 744
- Inscription: 13 Oct 2004
une recherche fulltext pour chercher un nom... c'est peut-etre prendre un semi-remorque pour transporter une boite d'oeufs
Enfin, pourquoi pas. en ce qui concerne les ressources tout depend de la base qui est derriere.
ceci pourrait parfaitement etre satisfaisant:
Enfin, pourquoi pas. en ce qui concerne les ressources tout depend de la base qui est derriere.
- Code: Tout sélectionner
2) je veux pas utiliser WHERE nom LIKE '%dupond%' car retourne aussi noms tels que "aduponde" ou "dupondus" ...
ceci pourrait parfaitement etre satisfaisant:
- Code: Tout sélectionner
WHERE (nom LIKE '% dupond%' OR nom LIKE '%dupond %')
-

jerome347 - WRInaute impliqué

- Messages: 573
- Inscription: 19 Mar 2004
WHERE (nom LIKE '% dupond%' OR nom LIKE '%dupond %')
Ca ne changerait rien, ça prendrait aussi les adupond ou les dupondus.
Comment sont séparés les noms dans le champs ?
Parce que tu pourrais faire like '%,dupond,% si ce sont des virgules par exemple.
- shrom
- WRInaute impliqué

- Messages: 865
- Inscription: 5 Juil 2004
Déjà, tu a un problème avec la structure de ta BDD car cette situation ne devrait pas arriver.
Cependant, si tu ne veux pas modifier ta structure, tu peux essayer:
Cependant, si tu ne veux pas modifier ta structure, tu peux essayer:
- Code: Tout sélectionner
WHERE nom LIKE '% dupond %'
-

itsme - WRInaute impliqué

- Messages: 744
- Inscription: 13 Oct 2004
Déjà, tu a un problème avec la structure de ta BDD car cette situation ne devrait pas arriver.
+1000
Tu as un probleme qui se situe deja bien en amont de ce que tu nous decrit: Tu devrais avoir un champs nom et un champs prenom et non un champs fourre-tout.
Quelque soit la methode que tu utiliseras, tu n'obtiendras jamais le resultat souhaite qui est de recuperer uniquement dupont pour une recherche de dupont.
Sauf si tu mets dupont dans un champs precis et que dupont soit indexe.
Et encore, dupont c'est jouable, mais les "jean marc" ou les "jean-marc" ou encore "j.marc"...
-

itsme - WRInaute impliqué

- Messages: 744
- Inscription: 13 Oct 2004
jerome347 a écrit:WHERE (nom LIKE '% dupond%' OR nom LIKE '%dupond %')
Ca ne changerait rien, ça prendrait aussi les adupond ou les dupondus.
Comment sont séparés les noms dans le champs ?
Parce que tu pourrais faire like '%,dupond,% si ce sont des virgules par exemple.
Rhaaa... pinailleur
il n'y a qu'a faire
WHERE concat(' ',nom,' ') LIKE '% dupond %'
mais je persiste a dire qu'il faut concevoir proprement une base de donnee avant de se lancer dans des bidouilles pas performantes
- caro
- WRInaute impliqué

- Messages: 871
- Inscription: 21 Juil 2003
1) jerome347 a entièrement raison car avec la recherche LIKE ca ne marchera jamais
2) les noms dans le champs sont séparés par des espaces (mais pas en début ni en fin donc l'astuce %espaceDUPONDespace% n'est pas valable)
3) shrom, pourquoi un problème de structure ? la base doit contenir obligatoirement ce champs qui inscrit les noms de clients selon les achats.
c'est sur que si je fais une autre chose sans rapport avec mes besoins ce sera plus facile
4) itsme, pourquoi veux tu que je mette des prénoms, c'est un champs qui contient des NOMS lol
bon, je crois que je vais rester en FULLTEXT,
une autre idée les gars ?
2) les noms dans le champs sont séparés par des espaces (mais pas en début ni en fin donc l'astuce %espaceDUPONDespace% n'est pas valable)
3) shrom, pourquoi un problème de structure ? la base doit contenir obligatoirement ce champs qui inscrit les noms de clients selon les achats.
c'est sur que si je fais une autre chose sans rapport avec mes besoins ce sera plus facile
4) itsme, pourquoi veux tu que je mette des prénoms, c'est un champs qui contient des NOMS lol
bon, je crois que je vais rester en FULLTEXT,
une autre idée les gars ?
-

itsme - WRInaute impliqué

- Messages: 744
- Inscription: 13 Oct 2004
2) les noms dans le champs sont séparés par des espaces (mais pas en début ni en fin donc l'astuce %espaceDUPONDespace% n'est pas valable)
faut lire attentivement, cette requette marchera puisque l'on ajoute les espaces eventuellement manquant avant le like:
- Code: Tout sélectionner
WHERE concat(' ',nom,' ') LIKE '% dupond %'
- caro
- WRInaute impliqué

- Messages: 871
- Inscription: 21 Juil 2003
itsme, c'est vrai qu'avec le "CONCAT" je pourrais me servir du "LIKE".
merci pour m'avoir fait découvrir "concat".
itsme, par contre j'aurais aimé te demander autre chose du coup, ma requete est plus complexe puisqu'ensuite je dois trier les noms comme cela :
1ere requete afin de trouver les champs comprenant 2 noms :
WHERE concat(' ',nom,' ') LIKE '% dupond %' AND concat(' ',nom,' ') LIKE '% martin %'
2eme requete afin de trouver les champs comprenant 1 des noms :
WHERE concat(' ',nom,' ') LIKE '% dupond %' OR concat(' ',nom,' ') LIKE '% martin %'
donc ca me fait 2 requetes comprenant chacune des OR ou AND,
dans ce cas est ce que je devrais pas me servir du FULLTEXT, car celui me permet de les classer par ordre sans rien faire avec une seule requete du type :
WHERE MATCH (nom) AGAINST ('dupond martin') ;
ca prend vraiment beaucoup de ressources le FULLTEXT ?
merci beaucoup pour ton aide
merci pour m'avoir fait découvrir "concat".
itsme, par contre j'aurais aimé te demander autre chose du coup, ma requete est plus complexe puisqu'ensuite je dois trier les noms comme cela :
1ere requete afin de trouver les champs comprenant 2 noms :
WHERE concat(' ',nom,' ') LIKE '% dupond %' AND concat(' ',nom,' ') LIKE '% martin %'
2eme requete afin de trouver les champs comprenant 1 des noms :
WHERE concat(' ',nom,' ') LIKE '% dupond %' OR concat(' ',nom,' ') LIKE '% martin %'
donc ca me fait 2 requetes comprenant chacune des OR ou AND,
dans ce cas est ce que je devrais pas me servir du FULLTEXT, car celui me permet de les classer par ordre sans rien faire avec une seule requete du type :
WHERE MATCH (nom) AGAINST ('dupond martin') ;
ca prend vraiment beaucoup de ressources le FULLTEXT ?
merci beaucoup pour ton aide
-

itsme - WRInaute impliqué

- Messages: 744
- Inscription: 13 Oct 2004
itsme, par contre j'aurais aimé te demander autre chose du coup, ma requete est plus complexe puisqu'ensuite je dois trier les noms comme cela :
1ere requete afin de trouver les champs comprenant 2 noms :
WHERE concat(' ',nom,' ') LIKE '% dupond %' AND concat(' ',nom,' ') LIKE '% martin %'
2eme requete afin de trouver les champs comprenant 1 des noms :
WHERE concat(' ',nom,' ') LIKE '% dupond %' OR concat(' ',nom,' ') LIKE '% martin %'
tu pourrais faire un union des 2 requettes mais la, franchement, ce que tu semble chercher c'est un resultat par scoring.
Dans ce cas, le fulltext est bien. tu ajoute une couche de levenshtein et tu obtiendra de bons resultats.
Tu peux trouver un exemple ICI et plus d'infos sur google
ca prend vraiment beaucoup de ressources le FULLTEXT ?
Je n'ai jamais dit ca
En fait, la recherche en fulltext est surtout performante sur des grandes tables. C'etait le sens du "prendre un semi-remorque pour transporter une boite d'oeufs"
Un resume simple de la recherche en fulltext.
Bon courage
- shrom
- WRInaute impliqué

- Messages: 865
- Inscription: 5 Juil 2004
caro a écrit:3) shrom, pourquoi un problème de structure ? la base doit contenir obligatoirement ce champs qui inscrit les noms de clients selon les achats.
Tu es dans un cas classique ou tu peux normaliser.
Si dans un champs tu as 3 ou 4 noms, relation 1->n, c'est le cas classique ou il faut créer une table nom avec jointure sur ta table principale.
Exmple: une table représentant des produits d'un côté et une table représentant des utilisateurs.
Table Product: product_id, name
Table User: user_id, name
Table de jointure: Basket: product_id, user_id
Ensuite tu fais:
- Code: Tout sélectionner
SELECT Product.name, User.name FROM Product, User, Basket WHERE Product.product_id=Basket.product_id AND User.user_id=Basket.user_id AND User.name='Dupond'
Donne l'ensemble des produits achetés par Dupond.
11 messages
• Page 1 sur 1
Formation recommandée sur ce thème :
Formation Google Analytics : en 2 jours, apprenez comment exploiter l'essentiel des possibilités de l'outil de mesure d'audience de Google. Formation animée par les experts Google Analytics de Ranking Metrics.
Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.
Lectures recommandées sur ce thème :
- Gestion des langues et des sessions en PHP / MySQL - 02-05-2004
- Algorithme de détection du link spam de masse - 09-11-2005
- Passage à l'heure d'été/hiver sur un forum phpBB - 31-10-2010
- Script de mise en cache des pages (PHP MySQL) - 09-08-2010
- Description du TrustRank - 06-06-2005
- GoogleStats : analyse temps réel des visites de Google sur votre site - 02-10-2002
- Sortie officielle de GoogleStats v2.0 ! - 23-02-2003
- AdSense Tracking : statistiques détaillées sur les clics AdSense - 29-02-2004
Consultez la description détaillée des produits ou services de Google suivants : Google TrustRank
Qui est en ligne
Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité
