Accents et moteur de recherche

Protoman - Modifié par Protoman le 29/01/2014 à 16:05
nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 - 30 janv. 2014 à 08:46
Bonjour,
Je suis actuellement en train de développer un moteur de recherche. Celui-ci fonctionne mais il y a quelques problèmes qui persistent; notamment un problème d'accent.
Lorsque je tape dan ma barre de recherche "aurelien", je récupère toutes les lignes comprenant le mot "Aurélien". Mais lorsque je tape "aurélien", il ne me retourne aucun résultat.
J'ai bien passé mon code en UTF8 ainsi que ma base, ma table et même les champs de ma table au même encodage, mais rien ne change (ma base est sur Mysql Query).

J'ai crée un index FULLTEXT qui, apparemment est bon, du moins je n'ai pas de problème à ce niveau là.

Voici ma requête :
SELECT * FROM maTable WHERE MATCH (champ1, champ2, champ3, ....) AGAINST ( '$monparametre' IN BOOLEAN MODE)


J'ai bien cherché parmi les sujets qui pouvaient traité ce genre de problème, mais n'ais pas trouvé de solutions.

J'ai également une autre question : est-il possible de mettre plusieurs opérateurs sur un paramètre en SQL, du genre
'(+>$param*)'
?

Voilà. Je m'en remets à vous.

Merci d'avance :).


EDIT : Je viens de supprimer mon index FULLTEXT pour tenter de voir l'état de ma recherche sans, et pourtant ma recherche fonctionne (hormis les accents bien sur) comme s'il n'avait jamais existé. Donc peut-être que ça vient de mon index. Mais si c'est le cas, je ne vois pas comment.

ALTER TABLE maTable ADD FULLTEXT cdt_index (champ1, champ2, champ3, ....)

3 réponses

nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 17
Modifié par nagashima le 29/01/2014 à 17:30
salut


la première chose est qu'un traitement, afin de faire transiter tes données, est effectué sur les chaines. Du coup les é peuvent être changé en
& eacute;
(
&E acute;
pour la majuscule) ou en &# 233; (201 pour maj), et donc, même si mysql n'est pas sensible à la casse (dans ton cas c'est parametré comme ca), vérifie que tu n'essaye pas de matcher ce qui est traduit.
dis moi si je suis pas claire.

Je pense que le mieux est de te rendre insensible à la casse, et donc retirer l'accentuation lors de la récup du champ de recherche.


par contre je ne comprend pas

J'ai également une autre question : est-il possible de mettre plusieurs opérateurs sur un paramètre en SQL, du genre '(+>$param*)' ?

tu parle d'opérateur tel que le + ? que veux tu comme résultat par exemple ?

naga

ps : j'ai rajouté des espace dans les code (& ...) car 'é' s'affiche sinon
0
Hello,

Déjà merci pour ta réponse.
J'ai d'ailleurs oublié un élément qui peut s'avérer important; je travaille sur Zend Framework 2 (je ne sais pas si cela a une incidence particulière).

Du coup les é peuvent être changé en & eacute; (&E acute; pour la majuscule) ou en &# 233; (201 pour maj), et donc, même si mysql n'est pas sensible à la casse (dans ton cas c'est parametré comme ca), vérifie que tu n'essaye pas de matcher ce qui est traduit. 
dis moi si je suis pas claire.

En gros si je comprends bien, "é" est changé en "& eacute;"; mais tu veux dire que le code l'interprète comme ça ? Si c'est ça, c'est bizarre alors car quand je fais un var_dump() de ma requête, il me ressort bien le paramètre tel quel, c'est-à-dire avec les accents.
Concernant le fait de matcher, pas à ma connaissance, à moins que le système de traduction intégrer à ZF2 le fasse automatiquement (ce qui pourrait s'avérer fort possible).

Je pense que le mieux est de te rendre insensible à la casse, et donc retirer l'accentuation lors de la récup du champ de recherche. 

Actuellement ma collation est utf8_general_ci. Je ne vois pas laquelle mettre s'il y a un moyen de procéder avec un autre système d'encodage. Sinon oui, j'imagine qu'il faudra que je crée une fonction spécifique au balayage des caractèes spéciaux.

par contre je ne comprend pas 
""J'ai également une autre question : est-il possible de mettre plusieurs opérateurs sur un paramètre en SQL, du genre '(+>$param*)' ?""

tu parle d'opérateur tel que le + ? que veux tu comme résultat par exemple ?

Exact. Je me suis référé à la documentation concernant ces opérateurs : http://dev.mysql.com/doc/refman/5.0/fr/fulltext-boolean.html

J'ai essayé certains de ces opérateurs sur le paramètre que j'ai placé (
'(+>$param*)'
). Mais ça n'a pas l'air de marcher. Du coup, je ne sais pas si c'est moi qui est un problème au niveau de la syntaxe, ou si c'est tout simplement impossible.
0
nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 17
30 janv. 2014 à 08:46
salut !

Pour ce qui concerne le framework je ne l'utilise pas (et ne le connais pas plus). Je ne pense pas qu'il ai d'incidence à ce niveau mais sans en être certain.
Sinon ton var dump t'affiche la valeur envoyé ensuite, ce que je sous entend c'est "est-ce que l'encapsulation édite les caractères" (car du coup s'il y a une traduction d'un coté mais non retranscrit ensuite, ton cas sera le même ;]). Pour vérifier il faut que tu log les requêtes depuis ta base sql :

http://dev.mysql.com/doc/refman/5.0/fr/query-log.html

de cette manière tu auras la requête exécute au final, ce qui te permettra aussi de la tester en "live" (depuis ton requêteur).

Sinon oui, j'imagine qu'il faudra que je crée une fonction spécifique au balayage des caractèes spéciaux. 

c'est l'idée, au moins de cette manière tu saura que ton contenu est propre (j'ai du faire une mise en forme de chaine à mon taff pour comparer des contenu de chaines, et c'est beaucoup plus agréable, que ce soit en base ou pour l'utilisateur ^^).
tu peux trouver ici :
http://codes-sources.commentcamarche.net/source/view/100363/1326636

dans le code de la form1 (ou je me suis pas cassé la tête ^^) la fonction
cleanHTMLtoText
qui te permettra d'avoir la liste des caractères à éditer (les deux formes : avec la valeur num et avec l'encodage html) ... c'est juste que c'est long et ch**** a faire , là au moins t'as juste quelques remplacement à faire ;)


enfin, pour la partie concernant les opérateurs, moi j'utilise les expressions régulière (regexp).
j'ai regardé car ca m'interesse (bon du coup c'est limité au myisam), et donc je peux un peu en parler ^^ :
(+>$param*)

le truc c'est que ce début de mot (je suppose que c'est une variable php) tu le force (avec le +), donc dans tous les cas le score ne sera pas impacté ...
par exemple j'ai fais :

SELECT id,val,MATCH (val)
AGAINST ('+axe* >avant <arriere' IN BOOLEAN MODE)
FROM tab WHERE MATCH (val)
AGAINST ('+axe* avant arriere' IN BOOLEAN MODE);


qui me permet de récupérer les résultats du match et, en effectuant un select avec cette fonction, j'ai rajouté la récupération de la côte en appliquant mes filtres. Je suis pas si je suis très clair, mais en gros dans ton cas, diminuer ou augmenter le résultat sur un mot obligatoire n'au de toutes facons pas d'impact.

Mais pour répondre à ta question, mettre plusieurs opérateurs ne pose pas de problèmes :

SELECT id,val,MATCH (val)
AGAINST ('+axe* >~avant <arriere' IN BOOLEAN MODE)
FROM tab WHERE MATCH (val)
AGAINST ('+axe*' IN BOOLEAN MODE);


le '~' retire bien la valeur du résultat ;)

naga
0
Rejoignez-nous