condition where : recherche par mot clé

condition where : recherche par mot clé - SQL/NoSQL - Programmation

Marsh Posté le 11-07-2008 à 16:04:56    

Bonjour à tous, mon problème touche à un peu de php. A déplacer si nécessaire ;)
 
J'ai un formulaire de recherche qui permet de rechercher dans une table. Or dans le champ on peut taper des mots clé comme bon nous semble. (séparés par des espaces)
La requete simple serait:

Code :
  1. select * from table1 where nom like '%$mots_cles%'


Existe-il un moyen d'obtenir l'équivalent du résultat:

Code :
  1. select * from table1 where nom like '%$mot_cle1%' and nom like '%$mot_cle2%' and nom like '%$mot_cle3%' ...


autrement qu'en "explodant" les mots clés en PHP avec comme caractère séparateur l'espace et en construisant en conséquence dynamiquement la condition de ma requete?
 
En fait je cherche un moyen plus simple et compact d'arriver à ce résultat. (même si ce n'est pas bien dur non plus).


Message édité par welcominh le 11-07-2008 à 16:05:46

---------------
Direct-download.com, le moteur de recherche pour Mega
Reply

Marsh Posté le 11-07-2008 à 16:04:56   

Reply

Marsh Posté le 11-07-2008 à 16:09:18    

tu as regardé du cote de MATCH ?


---------------

Reply

Marsh Posté le 11-07-2008 à 16:12:28    

réponse: non :)
Je vais voir ca de plus près merci :)


---------------
Direct-download.com, le moteur de recherche pour Mega
Reply

Marsh Posté le 18-07-2008 à 10:32:52    

selon moi le plus simple serait d'utiliser le IN :

 

select * from table1 where nom IN (valeur1,valeur2,valeur3...);

 

tu peux peut-être y ajouter le signe % si tu recherches une valeur dans une chaine. A essayer.


Message édité par slr56 le 18-07-2008 à 10:33:12
Reply

Marsh Posté le 18-07-2008 à 10:56:03    

Je viens d'essayer. Ca ne marche pas avec le joker %. Si je ne me trompe pas, le IN compare des valeurs exactes et le joker % ne fonctionne qu'avec le LIKE. (pas sur à 100% pour ce dernier).
 
En tout cas, j'ai réalisé ma requete avec MATCH. C'est pile poil ce qu'il me fallait. Je ne connaissais pas cette fonction et c'est vraiment terrible  :love:. Je peux jouer sur quelques opérateurs pour faire jouer la pertinence, même si je ne m'en sers pas trop. Mais c'est trop fort.
 
Ouais c'est trop fort. J'l'ai pas déja dit?  :D


---------------
Direct-download.com, le moteur de recherche pour Mega
Reply

Marsh Posté le 01-08-2008 à 10:06:43    

Il y a un inconvénient apparemment avec le match, c'est qu'il n'inclut apparemment pas le comportement du like '%...%'.
Ce qui veut dire que quand j'ai match(nom) against('chevalier'), j'obtiens seulement les lignes ou il y a le mot chevalier dans le nom, séparé par des espaces. Par exemple je n'obtiens pas les lignes dont le nom est "les_chevaliers_du_zodiaque".
 
Y-a-t-il une solution pour inclure ce comportement? (je n'ai pas trouvé ca en tout cas) Car comme ca de tete, je ne vois que la solution de faire un UNION avec une 2e requete like '%...%'.
 
Merci beaucoup.


---------------
Direct-download.com, le moteur de recherche pour Mega
Reply

Marsh Posté le 01-08-2008 à 10:25:20    

la réponse se situe dans le post de flo850.
 
il n'y en a pas de meilleure, le like est juste un test pour savoir si le cerveau de l'utilisateur est en état de marche ou pas. l'utiliser pour ce genre de recherches est une preuve qu'il ne marche pas du tout :o

Reply

Marsh Posté le 01-08-2008 à 10:45:01    

En fait, je ne décide pas de comment est rempli le champ nom. Pour des raisons de pertinence des résultats, je dois aussi récupérer les lignes qui  vérifient le like '%..%'. Du coup, je ne pense pas pouvoir m'en passer :/


---------------
Direct-download.com, le moteur de recherche pour Mega
Reply

Marsh Posté le 01-08-2008 à 10:46:52    

si, en lisant la réponse de flo850...
 
(/me vient de relire tout le topic en fait, et aurait du commencer par là :ange:)
 
ben là c'est rapé.
 
d'un autre côté c'est bien d'ajouter des contraintes de ce genre, ça oblige les gens qui parlent le leetas ou le sms à faire un effort au risque de ne jamais être lus :p
 
et il n'est pas pertinant de retourner des résultats illisibles selon moi.


Message édité par MagicBuzz le 01-08-2008 à 10:49:27
Reply

Marsh Posté le 01-08-2008 à 10:58:18    

Pour te répondre, il n'y a pas vraiment besoin d'écrire sms pour ne pas obtenir de résultat. Le visiteur lambda tapera par exemple "guide du routard". Objectivement ce n'est pas mauvais comme recherche je trouve. Par contre, pas mal de résultats ne sortiront pas car le nom sera de la forme "guide_routard" ou alors "routard_le_guide".

 

Donc si je comprends bien, pas de solution propre apparemment. Je vais devoir bidouiller un peu  :D


Message édité par welcominh le 01-08-2008 à 11:29:01

---------------
Direct-download.com, le moteur de recherche pour Mega
Reply

Marsh Posté le 01-08-2008 à 10:58:18   

Reply

Marsh Posté le 01-08-2008 à 11:03:51    

match ne recherche pas forcément TOUS les termes. donc ton fichier devrait ressortir si tu recherches une phrase contenant au moins un mot contenu dans ton match.
 
d'autant que tu peux parfaitement faire un match(premier mot) or match(second mot), etc. mais aussi jouer avec les weight, near, etc.
 
(et accessoirement, il n'y a pas que match comme instruction pour la recherche littérale)
 
par contre, pas sûr que mysql reconnaisse le _ comme une ponctuation. j'imagine que c'est paramétrage cependant
 
et je regrette, les gens qui noment leurs fichiers pirate comme ça, ils méritent pas de vivre, on sait même pas les langues de la BO ni des SUB :o
 
c'est donc pas un résultat pertinant :p
(ps et change le nom de ton exemple douteux avant qu'un modo passe par là)


Message édité par MagicBuzz le 01-08-2008 à 11:07:26
Reply

Marsh Posté le 01-08-2008 à 11:39:13    

oui je savais que match ne recherchait pas tous les termes. Ce coté ci ne me pose pas de problème vu qu'on peut le faire ou non.
Ce qui pose problème c'est comme tu le soulignes le fait que mysql ne reconnaissent pas le _ comme séparateur. Apres oui c'est surement paramétrable, tout comme le nombre de lettres minimum d'un mot pour qu'il soit pris en compte par la recherche (4 par défaut, j'aimerais le passer à 3 voire 2). Du coup oui, c'est principalement pour des raisons de config (que je ne peux changer) que le match n'est pas appropriée à 100%. Je trouve cette fonction néanmoins très intéressante, et je la garde dans un coin.
 
Pour l'exemple que je t'ai donné (lol va voir en quoi j'ai renommé ca  [:aztechxx]), ce n'était qu'un exemple. Rassure toi il y a tout de même des noms bien formés. Mais parfois il s'agit de résultat unique. Moi aussi je trouve un peu moyen des noms comme cela, mais c'est quand même mieux d'avoir un résultat proche comme ca, que d'obtenir un gros "0 résultat"  :D
 
En attendant j'ai testé avec un like '%...%'. Ca marche plutot bien coté pertinence.


---------------
Direct-download.com, le moteur de recherche pour Mega
Reply

Marsh Posté le 01-08-2008 à 11:42:52    

le principal souci du like, c'est que tu n'as pas le champ score en sortie qui te permet de faire un indice de pertinance :/
 
à la limite, je laisserais les deux requêtes : par défaut, "match" et une case à cochée "recherche merdique qui ramène plus de résultats qui n'ont rien à voir au bout de 4 heures et qui ne sont pas triés" ;)


Message édité par MagicBuzz le 01-08-2008 à 11:43:55
Reply

Marsh Posté le 01-08-2008 à 11:50:33    

Oui en effet, pas de score de pertinence...
Oui j'ai envisagé de laisser les 2. Mais pas avec une case à cocher.
Plutot une liste de résultats à la suite. (avec une indication sur le type de recherche pourquoi pas, je verrai comment je nommerai ca).

 

En tout cas merci pour ta contribution :)


Message édité par welcominh le 01-08-2008 à 11:51:30

---------------
Direct-download.com, le moteur de recherche pour Mega
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed