PostgreSQL全文搜索西班牙语字符Ñ

7

在使用PostgreSQL进行全文搜索时,我遇到了一个问题:在包含西班牙语字符“Ñ”的文本上执行搜索。

当我尝试对西班牙单词“AÑO”(年)进行分词时,根据输入是大写还是小写,我会得到以下结果:

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

如您所见,结果不同且区分大小写,因此如果搜索查询包含此字符,则会使我的应用程序的全文搜索查询区分大小写。
有没有办法解决这个问题?我一直在PostgreSQL全文搜索文档中寻找答案,但不知道如何更改安装的字典的行为。
非常感谢。 Martí

你的client_encoding是什么?..服务器的呢?.. 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进行复现。 - Vao Tsun
我的客户端和服务器编码都是UTF8。 - Marti Pàmies Solà
我的数据库参数是:CREATE DATABASE cda_repository WITH OWNER = cda_repository_owner ENCODING = 'UTF8' 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'; 非常感谢 - Marti Pàmies Solà
请阅读丹尼尔的精彩答案。 - Vao Tsun
1个回答

5
to_tsvector的能力将Ñ转换为ñ取决于语言环境,特别是lc_ctype。假设您的数据库使用的是C这样的LC_CTYPE,它的知识仅限于US-ASCII
使用与Unicode兼容的LC_CTYPE的示例:
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)
注意,小写化是您所期望的。
相反的例子是使用C
创建:
CREATE DATABASE cc lc_ctype 'C' template template0;

请注意,与问题中的情况不同,这里没有小写处理:
cc=> 显示 lc_ctype ;
 lc_ctype 
----------
 C
(1 行)
cc=> 选择 to_tsvector('spanish','AÑO'),to_tsquery('spanish','año'); to_tsvector | to_tsquery -------------+------------ 'aÑo':1 | 'año' (1 行)

是的,你说得对Daniel:DB参数是CREATE DATABASE cda_repository WITH OWNER = cda_repository_owner ENCODING = 'UTF8' 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。非常感谢。 - Marti Pàmies Solà

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接