Moteur de recherche en Full Text

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Moteur de recherche en Full Text

par Invité » 24 sept. 2007, 14:18

par contre, j'ai le même probleme que toi pour chercher d'amour, j'arrive pas à faire marcher le match against.
j'ai essayé
"d\'\'amour", 0 resultats
"d\'amour", 0 resultats
"d''amour" syntax error sql

probleme réglé... ça marche avec la dernière version de mysql...
tous mes qouotes sont donc doublés, et pour chercher d'amour en mat(ch against, j'utilise
"d\'\'amour"

bonen chance :)

par draciP » 24 sept. 2007, 11:46

Merci pour ta réponse (désolé... j'étais absent un petit moment :oops: ).
Malheureusement, je ne peux pas "recompiler" MySQL... je vais donc essayer ta deuxième méthode.
Merci ;)

par Invité » 14 sept. 2007, 11:42

pour ça:
Un second problème est quand je recherche "amour" seul : je ne trouverai pas "d'amour" ! Mais cela doit être lié au fait que mysql ne distingue pas le "d' " de "amour" !?

effectivement, le moteur de mysql qui cree les indexs et "decoupe en mots" ne reconnais pas le quote comme un delimiter de mots...

2 solutions:
recompiler ton mysql avec ça: (j'ai pas essayé, si ça marche, dis moi)
http://www.phpcs.com/infomsg_RECHERCHE- ... 17434.aspx

ou, c'est ce que j'ai fait, j'ai doublé mes quotes dans tous mes champs, par exemple, pour d'amour, dans la base, j'ai d''amour, '' etant reconnu comme delimiteur de mot. par contre, ça t'oblige à modifier à l'affichage pour pas voir tous des quotes doublés. avec ça, tu pourras chercher amour.

par contre, j'ai le même probleme que toi pour chercher d'amour, j'arrive pas à faire marcher le match against.
j'ai essayé
"d\'\'amour", 0 resultats
"d\'amour", 0 resultats
"d''amour" syntax error sql

si tu trouves, dis moi :)
([email protected])

par draciP » 10 sept. 2007, 14:58

help me :cry:

par draciP » 04 sept. 2007, 10:18

Merci pour ta réponse.
En fait, je pense que mon premier "problème" vient également du fait que la fonction mysql_real_escape_string échappe les guillemets "doubles"... comme dans ce code :

Code : Tout sélectionner

MATCH(titre,description,reference) AGAINST ('+\"deux* +mots\"* ' IN BOOLEAN MODE)
La question que je me pose (avec la solution que tu m'as fourni) est : est-ce bien sécurisé tout ça ? (car dans mes requêtes, en fait, j'utilise des guillemets "simples")

Comment feriez-vous pour traiter et sécuriser la requête d'un utilisateur dans un moteur de recherche ?

J'avoue que je suis un peu perdu ! :oops:
Merci...

par @rthur » 03 sept. 2007, 16:57

Bonjour,

Pour ta 1ère question, il me semble que MySQL le gère directement:
http://dev.mysql.com/doc/refman/5.0/fr/ ... xt-boolean
pomme banane
Recherche les lignes qui contiennent au moins un de ces mots.

+pomme -macintosh
Recherche les lignes qui contiennent "pomme'' mais pas "macintosh''.

pomm*
Trouve les lignes qui contiennent des mots tels que "pomme'', "pommes'', "pommier'', ou "pommeau''.

"deux mots"
Recherche les lignes qui contiennent exactement la phrase "deux mots''
Pour ta 2ème question, remplace
mysql_real_escape_string($search)
par
str_replace("\'","'",mysql_real_escape_string($search))
Ce qui ne devrait pas poser de problème vu que tu utilises des guillemets doubles pour délimiter ta requête SQL :)

par draciP » 03 sept. 2007, 12:33

Personne ? :?

Moteur de recherche en Full Text

par draciP » 29 août 2007, 17:00

J'ai un moteur de recherche interne sur un site qui ne fonctionne pas super...
Je récupère les mots de la requête, ensuite je fais un "petit" traitement :

Code : Tout sélectionner

$search = explode(" ", mysql_real_escape_string($search)); $recherche = ""; foreach($search as $value) { $recherche .= "+".$value."* "; }
Pour obtenir :

Code : Tout sélectionner

MATCH(titre,description,reference) AGAINST ('+deux* +mots* ' IN BOOLEAN MODE)
Mon problème est : comment gérer la requête "deux mots" (entre guillemets, pour rechercher l'expression exacte) et celle avec un apostrophe (comme "d'amour'' par exemple), en restant "secure" ?
Pour le moment, j'obtiens :

Code : Tout sélectionner

MATCH(titre,description,reference) AGAINST ('+\"deux* +mots\"* ' IN BOOLEAN MODE)
et

Code : Tout sélectionner

MATCH(titre,description,reference) AGAINST ('+d\'amour* ' IN BOOLEAN MODE)
A cause de la fonction mysql_real_escape_string (qui protège les caractères spéciaux d'une commande SQL), je ne trouve pas tous les résultats souhaités. Si je recherche "d'amour", je ne trouverai rien puisque "d'amour" devient "d\'amour".
Un second problème est quand je recherche "amour" seul : je ne trouverai pas "d'amour" ! Mais cela doit être lié au fait que mysql ne distingue pas le "d' " de "amour" !?
En quelque sorte, mon problème est de savoir comment bien utiliser les opérateurs pour une recherche booléenne dans MySQL...