Plusieurs mots clé dans le champ recherche, comment faire ?

fxfx92
Messages postés
4
Date d'inscription
samedi 23 juin 2007
Statut
Membre
Dernière intervention
3 juillet 2008
- 1 juil. 2008 à 10:42
fxfx92
Messages postés
4
Date d'inscription
samedi 23 juin 2007
Statut
Membre
Dernière intervention
3 juillet 2008
- 1 juil. 2008 à 20:11
Bonjour à tous,


J'ai un problème sur lequel je cale, et j'aimerais bien votre avis :

Je voudrais faire un moteur de recherche pour une association pour
chercher des membres. Je voudrais qu'on puisse faire des recherche par
code postal, département ou par ville, séparés par des virgules dans le
champ de recherche.

Exemple : lyon, 75, 69008 > sort les membres habitant à Lyon, dans le département 75 ou ayant le code postal 69008.

J'isole mes mots clé avec :
$mots = str_replace(",", " ", $mots);

$tab=explode(" " , $mots); //


Dans ma table, j'ai une colonne pour la ville, une pour le département, et une pour le code postal.


Est-ce qu'il faut que je regroupe ces 3 informations (ville, dep, cp)
dans une seule colonne (que je passerais en index?) et faire les
recherches dedans ou bien faut il faire un "explode" des mots-clé et
faire une recherche dans les 3 colonnes ???


Aussi, est-ce que qqun aurait un lien qui présente un script qui ressemblerait à ce que je voudrais faire ?


Merci infiniment pour votre aide !

5 réponses

Bling 182
Messages postés
510
Date d'inscription
lundi 27 novembre 2006
Statut
Membre
Dernière intervention
5 juillet 2009
3
1 juil. 2008 à 11:26
Tes 3 colonnes ne peuvent pas etre regroupées (a la limite, 75 et 69008 ca peut aller dans la meme, et encore... parce que avec le CP, tu as le département. Mais pas l'inverse.
Donc il va falloir que tu recherche dans les 2 (3) colonnes.
0
neigedhiver
Messages postés
2480
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
19
1 juil. 2008 à 14:12
Salut,

Comme le souligne Bling 182, le code postal contient le département. Tu peux donc te passer de ce dernier, puisque tu peux le retrouver (un vulgaire substr() suffit, et un malheureux petit tableau indexé pour avoir les noms des départements), mais à l'unique condition que la recherche d'un département se fasse par son numéro, et non par son nom.

Ensuite, pas besoin de "script" pour cette recherche : le plus important, c'est la requête SQL. Ensuite, c'est de l'affichage classique (éventuellement pour séparer les résultats selon que c'est le code postal/département ou la ville qui correspond à ce qui est recherché, mais c'est facultatif).

Donc, la requête SQL pourrait ressemble à quelque chose comme ça :

SELECT id, nom, prenom, etc FROM membres WHERE ville='%recherche%' OR code_postal='%recherche%';

Le mot "recherche" est à remplacer par une variable PHP lors de la construction de la requête en PHP.
Tu peux éventuellement choisir de trier selon la date d'adhésion, le nom de famille, etc.

<hr size="2" width="100%" />Neige

N'hésitez pas à lire la doc de PHP avant de poser des questions triviales...
0
fxfx92
Messages postés
4
Date d'inscription
samedi 23 juin 2007
Statut
Membre
Dernière intervention
3 juillet 2008

1 juil. 2008 à 18:31
Salut, merci pour vos réponses, c'est beaucoup plus clair maintenant pour la requête!

Je parlais de script car toutefois, le gros problème qui m'est posé en amont (enfin sauf si vous avez une meilleure idée bien sûr ), c'est de découper les mots clé de la recherche pour pouvoir faire ensuite mon Select.

Je m'explique :

Si qqun fait un recherche du genre : 75001, 75002, 75008, Suresnes , le résultat devra afficher la liste des membres habitant dans ces 3 départements et dans la ville de Suresnes.
Pour ménager les ressources du serveur en ligne (il y a tout de même 65.000 membres), je préfère que les codes postaux soit uniquement recherché dans la colonne "Code Postal", idem pour les villes.
Je pensais donc découper les mots recherchés avec mon explode (ca c'est bon), puis avec les regex identifier les mots qui sont des codes postaux des noms de ville (ca c'est bon aussi). Mon probleme est qu'il faudra ensuite compter ces codes postaux et ville et composer ma requete Select en conséquence et selon donc le nombre de codes postaux ou de villes choisis en recherche.

Exemple : SELECT id, nom, prenom, etc FROM membres WHERE ville='%ville1%' OR ville='%ville2%' OR code_postal ='%code_postal1% OR code_postal ='%code_postal2% OR code_postal ='%code_postal3%;

Est-ce que vous avez une idée de comment procéder s'il vous plait ?
A moins que je fasse fausse route sur la construction en amont de la requête ?

Merci pour votre aide, c'est vraiment sympa !
0
neigedhiver
Messages postés
2480
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
19
1 juil. 2008 à 18:44
Moi, ça me choque pas.
Faudrait bencher mysql pour voir comment optimiser la requête au mieux.
Faut quand même pas oublier les index, à bien définir (ça, c'est le plus tendu en fait). La doc de MySQL est assez peu causante sur le sujet... Des livres spécialisés seraient probablement plus pertinents.

D'autres pistes à réfléchir :
- une mise en cache des recherches (plus exactement, un index construit lors de l'enregistrement de membres, etc)
- les regex dans MySQL
Quant à une recherche FULLTEXT, je pense que c'est pas vraiment approprié pour une recherche sur un champ (en l'occurrence la ville) qui contient le plus souvent un seul mot.

<hr size="2" width="100%" />Neige

N'hésitez pas à lire la doc de PHP avant de poser des questions triviales...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
fxfx92
Messages postés
4
Date d'inscription
samedi 23 juin 2007
Statut
Membre
Dernière intervention
3 juillet 2008

1 juil. 2008 à 20:11
    Re,

Yep merci pour tes tuyaux, je pensais effectivement à utiliser un index. Et pour les requêtes je vais faire comme tu me dis et voir combien de temps elles prennent. Ca sera sûrement plus long que des recherches dans des colonnes ciblées, au pire je m'en contenterais mais ca va sûrement me démanger de savoir qu'il y a une solution plus économe et rapide...Je pourrais toujours améliorer le code par la suite...
0