PostgreSQL
La base de données la plus sophistiquée au monde.

Ouverture de session

Navigation

Contactez-nous

Administration du site :
"equipe chez postgresqlfr point org"

Contact presse :
"fr chez postgresql point org"

Contact association :
"bureau chez postgresqlfr point org"

Questions PostgreSQL :
 IRC :
  serveur irc.freenode.net
  canal #postgresqlfr

Recherche

Accéder aux archives

« Octobre 2008  
Lun Mar Mer Jeu Ven Sam Dim
  2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31  

Syndication

Flux XML

Sondage

Quelle est la version de PostgreSQL la plus répandue sur vos serveurs ?
8.3
10%
8.2
42%
8.1
40%
8.0
2%
7.4
6%
7.3 ou antérieure
0%
Nombre de votes: 48

Recherche plien-texte et caractères accentués

Technique - général | Recherche plien-texte et caractères accentués

Par jerome le 20/05/2008 - 19:06

Bonjour,

Je cherche à utiliser le "nouveau" module de recherche plain texte intégré à PostgreSQL 8.3.
J'utilise une base encodée en SQL_ASCII (je crains que le problème vienne de là, mais je ne peux pas changer...) et je voudrais pouvoir utiliser les commandes ts_*

Dans ma configuration, j'ai: default_text_search_config = 'pg_catalog.french'. Mais si j'exécute des requêtes sur des valeurs avec accents, le résultat est incohérent; par exemple

SELECT to_tsvector('médecin') renvoie 'decin':2

alors que

SELECT to_tsvector('medecin') renvoie bien 'medecin':1

Evidemment, tout les recherches avec ts_query sont alors incohérentes...

Par avance, merci pour votre aide

Jérôme

Options d'affichage des commentaires

Sélectionnez la méthode d'affichage des commentaires que vous préférez, puis cliquez sur "Sauvegarder les paramètres" pour activer vos changements.

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


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


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,


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


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.


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


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


© PostgreSQLFr, tous droits réservés.
Site déclaré à la CNIL sous le numéro 1074678, conformément à la Loi en vigueur.