2017-08-08 64 views
2

我面临的文本做全文搜索PostgreSQL的时候,它包含德西班牙字符“N”PostgreSQL的全文搜索西班牙字符全

当我尝试来标记西班牙语单词“AÑO”(年)的问题我得到下面的结果取决于如果输入大写或小写:

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

正如你所看到的结果是不一样的,它是区分大小写的,所以它使我的应用程序的全文搜索查询大小写敏感的,如果他们包含这个字符。

有什么办法可以解决这个问题吗?我一直在搜索有关全文搜索的PostgreSQL文档,并且我不知道如何在安装的字典中更改此行为。

非常感谢。 马蒂

+0

什么是你'client_encoding' ..和服务器?一个?..'''t =#SELECT to_tsvector('spanish','AÑO'),to_tsvector('spanish','año'); to_tsvector | to_tsvector ------------- + ------------- 'año':1 | 'año':1 (1 row) Time:69.873 ms t =#show client_encoding; client_encoding ----------------- UTF8 (1 row)'''不能用UTF8重现 –

+0

我的客户端和服务器编码是UTF8。 –

+0

我的分贝参数应用是:CREATE DATABASE cda_repository WITH OWNER = cda_repository_owner ENCODING = 'UTF8' TABLESPACE = cda_repository_fast_ts LC_COLLATE = 'C' LC_CTYPE = 'C' 连接限制= -1; ALTER DATABASE cda_repository SET default_text_search_config ='pg_catalog。西班牙“;谢谢你这么多 –

回答

2

Ñ转换成ñ的能力to_tsvector取决于语言环境,特别在lc_ctype。假设您的数据库正在使用LC_CTYPE,如C,其知识仅限于US-ASCII

例如用LC_CTYPE与兼容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) 

注意,downcasing是你所期望的。

相反的例子有C

创作:

CREATE DATABASE cc lc_ctype 'C' template template0; 

注缺乏downcasing的,如问题:

 
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

是的,你是对的丹尼尔:DB参数是CREATE DATABASE cda_repository 具有所有者= cda_repository_owner 编码= 'utf-8' TABLESPACE = cda_repository_fast_ts LC_COLLATE = 'C' LC_CTYPE = 'C' CONNECTION LIMIT = -1; ALTER DATABASE cda_repository SET default_text_search_config ='pg_catalog.spanish';在开始时我们应该存储国际文本,为此我们使用这些值。但最后所有的文字都用西班牙文。可能是我们不得不考虑重新创建数据库并更改LC_COLlATE和LC_CTYPE非常感谢 –