SphinxSearch et charactères interdits

10 réponses
AuteurMessage

Bool |
Modérateur

Photo de Bool

Inscrit le : 09/05/2005

# Le 04/10/2013 à 17:39

Hello les gens,

je me heurte à un petit problème avec SphinxSearch, ou plus précisement SphinxQL, c'est à dire la couche de compatibilité MySQL pour Sphinx : certains caractères sont tout bonnement interdits dans la recherche, sous peine de se prendre une erreur.

Par exemple :

SELECT * FROM monIndex WHERE MATCH('http://foo')


déclenche :
Syntax error or access violation: 1064 index monIndex: syntax error, unexpected '/' near '//foo'



Et vu que le contenu de ce MATCH() vient d'un formulaire HTML, c'est assez pénible...
J'ai beau retourner la doc dans les sens, je ne vois rien à ce sujet... et j'imagine que la seule solution est d'utiliser l'API native plutôt que SphinxQL.

Ceux d'entre vous qui utilisent Sphinx, avez-vous rencontré le problème, et comment l'avez-vous résolu ?

daevel : infogérance et conseilOuvrir dans une nouvelle fenetre || moiOuvrir dans une nouvelle fenetre

tonguide | Jeremy
Modérateur

 

Inscrit le : 09/05/2005

# Le 04/10/2013 à 18:57

T'auras probablement déjà essayer mais je le dis quand même au cas ou ...

$q = str_replace('/','\\\/',$q);

toutgagner | Olivier
Modérateur

 

Inscrit le : 09/05/2005

# Le 04/10/2013 à 19:01

moi je dirais :

$query = $cl->EscapeQuery($_GET['q']);
$sql = "SELECT * FROM test1 WHERE MATCH('".mysql_escape_query($query)."')";

ce qui te donnerait un truc du genre

SELECT * FROM monIndex WHERE MATCH('http:\\/\\/foo')

Le truc, c'est que la chaîne dans SphinxQL est une quoted string et que le premier groupe de slashes est utilisé par le parser et qu'il t'en faut donc deux.

(LOL, je viens d'écrire en chinois, en anglais c'est sans doute mieux : http://sphinxsearch.com/forum/view.html?id=9558Ouvrir dans une nouvelle fenetre )

(Message édité le 04-10-2013 à 19h08 par toutgagner)

Jeux-concoursOuvrir dans une nouvelle fenetre
La Bible du voyageur malinOuvrir dans une nouvelle fenetre
Voyages discountOuvrir dans une nouvelle fenetre
New job : Attaché parlementaire

Bool | Olivier
Modérateur

Photo de Bool

Inscrit le : 09/05/2005

# Le 04/10/2013 à 19:22

@tonguide : en fait, je n'ai même pas essayé, n'ayant trouvé aucune référence aux caractères d'échappement utilisé

$query = $cl->EscapeQuery($_GET['q']);

Ça c'est une méthode de l'API, donc quitte à installer l'API, autant l'utiliser plutôt que de passer par le wrapper MySQL. Mais je vais regarder le code du truc

daevel : infogérance et conseilOuvrir dans une nouvelle fenetre || moiOuvrir dans une nouvelle fenetre

tonguide | Jeremy
Modérateur

 

Inscrit le : 09/05/2005

# Le 04/10/2013 à 19:23

Sinon http://stackoverflow.com/questions/6275042/how-to-...Ouvrir dans une nouvelle fenetre

Bool | Olivier
Modérateur

Photo de Bool

Inscrit le : 09/05/2005

# Le 04/10/2013 à 19:31

Bon bah la liste des caractères spéciaux : http://git.php.net/?p=pecl/search_engine/sphinx.gi...Ouvrir dans une nouvelle fenetre

Et du coup :

$string = preg_replace('#([()|\\-!@~"&/\\\\])#', '\\\\$1', $string);



@tonguide : yep, au final c'est ça. Merci !

(Message édité le 04-10-2013 à 19h56 par Bool)

daevel : infogérance et conseilOuvrir dans une nouvelle fenetre || moiOuvrir dans une nouvelle fenetre

Bool | Olivier
Modérateur

Photo de Bool

Inscrit le : 09/05/2005

# Le 04/10/2013 à 19:32

toutgagner a dit :
...
Le truc, c'est que la chaîne dans SphinxQL est une quoted string et que le premier groupe de slashes est utilisé par le parser et qu'il t'en faut donc deux.

(LOL, je viens d'écrire en chinois, en anglais c'est sans doute mieux : http://sphinxsearch.com/forum/view.html?id=9558Ouvrir dans une nouvelle fenetre


Oui ça c'est complètement normal, même si j'ai tendance à la rabâcher bien trop souvent :p

daevel : infogérance et conseilOuvrir dans une nouvelle fenetre || moiOuvrir dans une nouvelle fenetre

Bool | Olivier
Modérateur

Photo de Bool

Inscrit le : 09/05/2005

# Le 04/10/2013 à 19:44

Donc, problème résolu. Reste maintenant à voir si on peut indexer des URL dans du texte, mais ça c'est une autre histoire.

daevel : infogérance et conseilOuvrir dans une nouvelle fenetre || moiOuvrir dans une nouvelle fenetre

acti | Stéphane
Modérateur

Photo de acti

Inscrit le : 13/11/2005

# Le 04/10/2013 à 19:44

En Python, on utilise la Regex suivante pour "échapper" les caractères :

re.sub(r"([=\(\)<>|\-!@~\"&/\\\^\$\=])", r"\\\1", value)

Explications :
Returns an escaped string. Escape characters that are treated as special operators by the query language parser.

Stéphane

Bool | Olivier
Modérateur

Photo de Bool

Inscrit le : 09/05/2005

# Le 04/10/2013 à 19:56

Yep, c'est très similaire à ce qu'indiquait tonguide.

daevel : infogérance et conseilOuvrir dans une nouvelle fenetre || moiOuvrir dans une nouvelle fenetre

acti | Stéphane
Modérateur

Photo de acti

Inscrit le : 13/11/2005

# Le 04/10/2013 à 20:05

Yep, ça te permet de voir les caractères en question.

Stéphane

Répondre

Vous ne pouvez pas participer au forum, car votre inscription n'a pas été validée. Pour vous faire valider en tant que Membre, cliquez ici.

© MHN - Tous droits réservés | CNIL N°844440 | 23/11/2024 13:53:43 | Généré en 7.7ms | Contacts | Mentions légales |