Re: [1/2HS] Interrogations MySQL
Le 02/02/16 à 13:14, BERBAR Florian <florian.berbar@free.fr> a écrit :
BF> -----BEGIN PGP SIGNED MESSAGE-----
BF> Hash: SHA256
BF>
BF> On 02/02/2016 11:34, andre_debian@numericable.fr wrote:
BF> > Bonjour,
BF> >
BF> > Désolé de cette question pas 100% Debian, mais MySQL tourne sous
BF> > Debian Jessie :-)
BF> >
BF> > $brief est une variable correspondant à un mot clé qui ne peut
BF> > contenir que 3 infos maxi séparées par un espace.
BF> >
BF> > On va supposer que le mot clé = "paris"
BF> >
BF> > SELECT DISTINCT email, prenom, famille, ville FROM table WHERE
BF> > MATCH (email, prenom, famille, ville) AGAINST ('+$brief[0]
BF> > +$brief[1] +$brief[2]' IN BOOLEAN MODE)
BF> >
BF> > et la base affiche toutes les personnes qui ont une info liée à
BF> > Paris.
BF> >
BF> > Mais si le mot clé =" par" la base ne m'affiche aucun résultat.
BF> > Elle ne va matcher que les infos qui contiennent * exactement *
BF> > "par"
BF> >
BF> > J'ai tenté cette méthode (ajouter un "%" de part et d'autres de la
BF> > variable) : AGAINST ('+%$brief[0]% +%$brief[1]% +%$brief[2]%' IN
BF> > BOOLEAN MODE) ça ne fonctionne pas.
BF> >
BF> > Dommage, car c'est utile lorsque on est pas sûr de l'orthographe
BF> > d'un champ, et que l'on a retenu que ses x premières lettres.
BF> >
BF> > Il y a cette méthode mais trop basique car elle ne permet pas des
BF> > recherches sur mots clés multiples : SELECT DISTINCT email, prenom,
BF> > famille, ville FROM table WHERE email LIKE '%$brief%' OR ville LIKE
BF> > '%$brief%' ...
BF> >
BF> > Ma question : comment le faire avec : ... WHERE MATCH ... AGAINST
BF> >
BF> > Merci.
BF> >
BF> > André
BF> >
BF>
BF> Bonjour André,
BF>
BF> Je en regardant la requête SQL utilisant la fonction AGAINST que tu
BF> essais d’exécuter, nous pouvoir voir que tu tentes d'utiliser le
BF> caractère joker (wildcard) '%' afin de compléter les mots clefs
BF> servant de critère à ta requête à l'image de ce que tu pourrais faire
BF> à l'aide de la fonction LIKE.
BF>
BF> La documentation de MySQL au sujet du couple de fonction MATCH et
BF> AGAINST
BF> (https://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html#function_m
BF> atch),
BF> ne fait pas référence à la possibilité d'utiliser des caractères
BF> jokers (wildcard) à l'image de ce que tu pourrais faire avec la
BF> fonction LIKE
BF> (https://dev.mysql.com/doc/refman/5.7/en/string-comparison-functions.htm
BF> l#operator_like).
BF> Il semblerait que tu sois contraint à l’utilisation de mot complet.
De mémoire pour ce genre de chose il fallait effectivement indexer soi-même les mots et les
"début de mot".
Un SGBDR est pas très performant sur ce genre de chose (même si postgresql fait un peu mieux je
crois), pour de gros volume ajouter un solr ou elasticsearch est finalement plus simple (on le
configure une fois en lui donnant les champs à indexer et il fournit autocompletion et
recherche par facette, entre autre). Pour de petits volume, faut ajouter un peu de code.
--
Daniel
La vie est trop courte pour qu'on soit pressé.
Henry David Thoreau
Reply to: