FULLTEXT dans mysql

  • Auteur de la discussion Auteur de la discussion caro
  • Date de début Date de début
WRInaute impliqué
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
 
WRInaute impliqué
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.

Code:
2) je veux pas utiliser WHERE nom LIKE '%dupond%' car retourne aussi noms tels que "aduponde" ou "dupondus" ...
ceci pourrait parfaitement etre satisfaisant:
Code:
WHERE (nom LIKE '% dupond%' OR nom LIKE '%dupond %')
 
WRInaute occasionnel
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.
 
WRInaute impliqué
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:
Code:
WHERE nom LIKE '% dupond %'
 
WRInaute impliqué
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"...
 
WRInaute impliqué
jerome347 a dit:
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 :P

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 :)
 
WRInaute impliqué
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 :lol:

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 ?
 
WRInaute impliqué
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:
WHERE concat(' ',nom,' ') LIKE '% dupond %'
 
WRInaute impliqué
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
 
WRInaute impliqué
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 :)
 
WRInaute impliqué
caro a dit:
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:
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.
 

➡️ Offre MyRankingMetrics ⬅️

pré-audit SEO gratuit avec RM Tech (+ avis d'expert)
coaching offert aux clients (avec Olivier Duffez ou Fabien Faceries)

Voir les détails ici

coaching SEO
Discussions similaires
Haut