2017-08-08 2 views
2

Je suis confronté à un problème lorsque vous faites la recherche en texte intégral avec PostgreSQL sur le texte qui contient de caractère espagnol ÑPostgreSQL Texte intégral Recherche caractère espagnol Ñ

Lorsque je tente de tokenizer le mot espagnol Ano '(année) Je reçois les résultats suivants en fonction de si l'entrée est supérieure ou inférieure cas:

SELECT to_tsvector('spanish','AÑO'),to_tsquery('spanish','año') 
"to_tsvector" "to_tsquery" 
"'aÑo':1" "'año'" 

Comme vous pouvez le voir le résultat n'est pas le même et il est sensible à la casse, il fait ma demande de recherche en texte intégral interroge la casse si elles contient ce caractère.

Y at-il un moyen de résoudre ce problème? J'ai recherché dans la documentation de PostgreSQL sur la recherche en texte intégral, et je ne sais pas comment changer ce comportement sur les dictionnaires installés.

Merci beaucoup. Martí

+0

quel est votre 'client_encoding' .. et le serveur? un? .. '' 't = # SELECT to_tsvector ('espagnol', 'AÑO'), to_tsvector ('espagnol', 'año'); to_tsvector | to_tsvector ------------- + ------------- 'año': 1 | 'año': 1 (1 ligne) Durée: 69,873 ms t = # show client_encoding; client_encoding ----------------- UTF8 (1 row) '' 'ne peux pas reproduire avec UTF8 –

+0

mon codage client et serveur est UTF8. –

+0

mes db paramètres sont les suivants: CREATE DATABASE cda_repository avec le propriétaire = cda_repository_owner encoding = 'UTF8' TABLESPACE = cda_repository_fast_ts LC_COLLATE = 'C' LC_CTYPE = 'C' CONNECTION LIMIT = -1; ALTER BASE DE DONNÉES cda_repository SET default_text_search_config = 'pg_catalog.Espanol'; Merci beaucoup –

Répondre

2

La possibilité pour to_tsvector convertir Ñ en ñ dépend de l'environnement local, et plus particulièrement sur lc_ctype. Votre base de données utilise vraisemblablement un LC_CTYPE tel que C dont les connaissances sont limitées à US-ASCII.

Exemple avec un LC_CTYPE compatible avec Unicode:

 
test=> show lc_ctype; 
    lc_ctype 
------------- 
fr_FR.UTF-8 
(1 row) 

test=> SELECT to_tsvector('spanish','AÑO'),to_tsquery('spanish','año'); 
to_tsvector | to_tsquery 
-------------+------------ 
'año':1  | 'año' 
(1 row) 

Notez que le downcasing est ce que vous attendez.

exemple face avec C:

création:

CREATE DATABASE cc lc_ctype 'C' template template0; 

Notez l'absence de downcasing, comme dans la question:

 
cc=> show lc_ctype ; 
lc_ctype 
---------- 
C 
(1 row) 

cc=> SELECT to_tsvector('spanish','AÑO'),to_tsquery('spanish','año'); 
to_tsvector | to_tsquery 
-------------+------------ 
'aÑo':1  | 'año' 
(1 row) 
+0

Oui, vous avez raison Daniel: paramètres DB sont CREATE DATABASE cda_repository AVEC LE PROPRIÉTAIRE = cda_repository_owner encoding = 'UTF8' TABLESPACE = cda_repository_fast_ts LC_COLLATE = 'C' LC_CTYPE = 'C' LIMITE DE CONNEXION = -1; ALTER DATABASE cda_repository SET default_text_search_config = 'pg_catalogue.spanish'; Au début, nous devrions stocker du texte international et pour cela nous utilisons ces valeurs. Mais finalement tout le texte est en espagnol. Peut-être que nous devons penser à recréer la base de données et changer LC_COLlATE et LC_CTYPE Merci beaucoup –