Je me réponds à moi-même,
jerome/ = 21 Mai, 2008 - 10:23
Je me réponds à moi-même, même si ma "solution" n'est absolument pas satisfaisante.
Supposons par exemple que je recherche 'médecin' dans la chaine 'le cabinet du médecin est fermé'
Une requête qui "marche", avec ou sans accent, est la suivante:
SELECT ts_headline(to_ascii('le cabinet du médecin est fermé','latin1'),q) FROM to_tsquery(to_ascii('médecin','latin1')) as q , to_tsvector(to_ascii('le cabinet du médecin est fermé','latin1')) as v where v @@ q
Mais, dans ce cas, on a perdu les accents dans l'affichage du résultat. Or, dans mon cas, ce n'est malheureusement pas acceptable.
Quelqu'un pourrait-il m'aider à avancer ?
Par avance, merci.
Cordialement,
Jérôme
[ Vous devez
vous connecter pour poster des commentaires ]
Bonjour
Jean-Paul Argudo/ = 27 Mai, 2008 - 14:58
Bonjour,
Vous avez bien pressenti tout seul la raison de vos ennuis. Vous *DEVEZ* avoir un encodage compatible avec la langue que vous stockez.
À NOTER: SQL_ASCII n'est pas un encodage particulier. C'est plutôt une "absence d'encodage". En fait, dans ce mode, PostgreSQL stocke tout ce qui lui parvient, sans se soucier de l'encodage. Ainsi, aucune conversion d'un type à l'autre est possible en SQL_ASCII.
La recherche plein texte dans PostgreSQL (8.3 ou dans tsearch2 pour les versions précédentes) est très intimement liée à l'encodage de la base ainsi qu'à la "collation" utilisée:
test=# show server_version;
server_version
----------------
8.3.1
(1 ligne)
test=# show lc_collate ;
lc_collate
-------------
fr_FR.UTF-8
(1 ligne)
test=# show lc_ctype ;
lc_ctype
-------------
fr_FR.UTF-8
(1 ligne)
test=# SHOW server_encoding ;
server_encoding
-----------------
UTF8
(1 ligne)
test=# show client_encoding ;
client_encoding
-----------------
UTF8
(1 ligne)
test=# SELECT to_tsvector('médecin');;
to_tsvector
-------------
'médecin':1
(1 ligne)
La solution serait donc dans votre cas d'utiliser un encodage en UTF8. La seule vrai question que vous devriez vous poser c'est pourquoi vous ne pourriez pas changer l'encodage de votre base...
Cordialement,
--
Jean-Paul ARGUDO
http://dalibo.com | http://dalibo.org
[ Vous devez
vous connecter pour poster des commentaires ]
Bonjour,
Tout d'abord, mer
jerome/ = 30 Mai, 2008 - 12:17
Bonjour,
Tout d'abord, merci pour votre réponse.
Il y a cependant un point qui continue à me chiffonner. Si je reprends votre exemple, on a en effet:
SELECT to_tsvector('médecin');;
to_tsvector
-------------
'médecin':1
(1 ligne)
La recherche fonctionnera donc correctement pour médecin, médecins, médecine,...
Mais ne va-t-elle pas échouer si l'on recherche medecin (sans accent) ? Et réciproquement, si je recherche médecin, je risque ne pas trouver MEDECIN.
Il s'agit pourtant sur un plan intellectuel de la même recherche.
Cordialement,
[ Vous devez
vous connecter pour poster des commentaires ]
Pas si sûr
SAS/ = 30 Mai, 2008 - 15:00
Bonjour,
Je ne suis pas sûr qu'il s'agisse de la même recherche. Dans un cas vous recherchez un mot du dictionnaire, correctement accentué.
Dans l'autre cas une approximation linguistique, puisqu'il s'agit d'un mot non accentué, donc non correctement orthographié.
Peut-être devriez-vous dans ce cas tenter une recherche approximative, c'est à dire par phonème ou soundex ou en supprimant préalablement les accents de votre dictionnaire ?
Librement,
Stéphane Schildknecht
Dalibo
PostgreSQLFr
[ Vous devez
vous connecter pour poster des commentaires ]
Sur le fonds, je suis d'accor
jerome/ = 30 Mai, 2008 - 17:21
Sur le fonds, je suis d'accord avec ce que vous dites, mais l'usage dans les moteurs de recherche généraux (Google...) fait que les recherche ne tiennent pas compte des accents. Et d'ailleurs, la plupart des personnes ne mettent pas d'accents sur les mots lorsqu'ils sont écrits en majuscules.
Et si j'utilise une méthode de type phonème, je vais perdre l'aspect "linguistique" qui, à mes yeux, fait l'intérêt de la recherche plein texte (par exemple, nominatif me retourne actuellement nomination, nominative, etc).
Mettre en place un score ou surligner les termes dans l'extrait va également devenir plus complexe.
[ Vous devez
vous connecter pour poster des commentaires ]
Bonjour,
Vous répondez
Jean-Paul Argudo/ = 2 Juin, 2008 - 09:50
Bonjour,
Vous répondez à nos réponses avec une autre problématique, je pense que vous en êtes conscient? :-)
Pour les réponses à vous apporter, je suis d'accord avec Stéphane. Il faut savoir ce que l'on veut!
Quant à "nominatif", aucun problème. La racine est "nomin":
test=# SELECT to_tsvector('nominatif');
to_tsvector
-------------
'nomin':1
(1 ligne)
Cordialement,
--
Jean-Paul ARGUDO
http://dalibo.com | http://dalibo.org
[ Vous devez
vous connecter pour poster des commentaires ]
Je n'ai pas compris...
jerome/ = 2 Juin, 2008 - 12:33
J'avoue ne pas avoir compris votre remarque; pourquoi s'agit-il d'une autre problématique ?
Mon objectif, d'un point de vue applicatif, est de faire une recherche plein-texte. Or, je crois avoir compris que c'est le périmètre couvert par "l'extension" tsearch2. Il se trouve que ses aspects linguistiques et fonctionnels (thésaurus...) répondent à merveille à mes besoins. Seul me pose problème le cas des accents. Or, je continue à penser qu'une (mauvaise ?) habitude communément acceptée consiste à écrire les termes en majuscules sans les accents, et il faut bien reconnaitre que nos claviers ne nous incitent guère à changer.
De même, les moteurs de recherche utilisés par les internautes ignorent les accents (Google et autres). Je considère (visiblement à tord) que cela fait partie des fonctionnalités qu'un moteur de recherche plein-texte devrait pouvoir remplir. C'est le cas (en fonction du paramétrage) de Lucene, MySql permet aussi des recherches insensibles aux accents. De mon point de vue, la question n'est pas de savoir qui a raison ou tord, mais l'idéal serait quand-même de laisser le choix sur la sensibilité ou non aux accents.
Vous vous en doutez, avant de poster sur ce forum, j'ai lancé des recherches sur Internet où j'ai pu constater que ce problème "gêne" de nombreux développeurs. Je suis d'ailleurs tombé sur un fil de discussion assez amusant au Canada où un développeur anglophone répondait sèchement à son collègue francophone qu'il suffisait d'interdire l'usage du français...
En tous cas, encore merci d'avoir consacré du temps pour me répondre. Je vais contourner le problème (mise en vecteur via to_tsquery(to_ascii('chaine à analyser','latin1')) ), ce qui a pour effet de supprimer les accents. L'extrait devient "pas beau", mais au moins, ça fonctionne comme je le souhaite au niveau de la recherche.
Encore merci à tous,
Cordialement
[ Vous devez
vous connecter pour poster des commentaires ]