从 v.9 升级到 v.11 后,由 PostgreSQL 中的简单词典生成的词位对于非拉丁语言不再小写
Lexemes produced by simple dictionary in PostgreSQL are not lower cased for non-Latin languages after upgrade from v.9 to v.11
在我们的项目中,我们使用 simple
词典对不同语言(英语、德语、希腊语、乌克兰语等)使用 PostgreSQL 的全文搜索功能。在我的本地机器 (macOS Mojave) 上,我使用 Homebrew 安装了 PostgreSQL。在尝试将 PostgreSQL 从版本 9.5.23 升级到 11.10 之后(基本上我只是删除旧版本并重新安装)我注意到当我尝试使用 to_tsvector
函数将我的文本转换为 tsvector
数据类型时使用非拉丁语言时,它会停止小写文本。如果它是基于拉丁语 (ASCII) 的,它仍然会将生成小写词位的文本小写。问题只是在我升级到版本 11 之后才出现(在我从 9.5.23 过渡升级到 10.15 之后它仍然按预期工作)。
示例(在版本 11.10、12.5、13.1 上):
SELECT to_tsvector('simple', 'Офісний Менеджер');
'Менеджер':2 'Офісний':1
SELECT to_tsvector('simple', 'Ελληνικά');
'Ελληνικά':1
SELECT ts_lexize('simple', 'Менеджер');
{Менеджер}
SELECT ts_lexize('simple', 'Manager');
{manager}
这是以前的样子(在版本 9.5.23 和 10.15 上):
SELECT to_tsvector('simple', 'Офісний Менеджер');
'менеджер':2 'офісний':1
SELECT to_tsvector('simple', 'Ελληνικά')
'ελληνικά':1
SELECT ts_lexize('simple', 'Менеджер');
{менеджер}
SELECT ts_lexize('simple', 'Manager');
{manager}
我尝试阅读所有发行说明,但没有看到与我的问题相关的任何内容。在 docs 中仍然声明
The simple dictionary template operates by converting the input token to lower case...
所以我假设 API 本身没有变化。
我怀疑他们在版本 11 中更改了一些影响此设置的默认配置参数,但我找不到任何有用的东西。
更新:
运行 \l
in psql shell 给了我以下内容。
# 11.10
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
--------------------+-----------------+----------+---------+-------+-------------------------------------
postgres | dmytrosavochkin | UTF8 | C | C |
template0 | dmytrosavochkin | UTF8 | C | C | =c/dmytrosavochkin +
| | | | | dmytrosavochkin=CTc/dmytrosavochkin
template1 | dmytrosavochkin | UTF8 | C | C | =c/dmytrosavochkin +
| | | | |
# 9.5.23
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
--------------------+-----------------+----------+-------------+-------------+-------------------------------------
postgres | dmytrosavochkin | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
template0 | dmytrosavochkin | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/dmytrosavochkin +
| | | | | dmytrosavochkin=CTc/dmytrosavochkin
template1 | dmytrosavochkin | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/dmytrosavochkin +
| | | | | dmytrosavochkin=CTc/dmytrosavochkin
好的,感谢@jjanes的评论我明白了(谢谢!)。
问题恰好出在Homebrew postgresql公式的设置上。基本上,当我安装 postgresql@9.5 时,它是 运行 initdb /usr/local/var/postgresql@9.5
来初始化集群,但是当我切换到 11.10 时,它是 运行 initdb --locale=C -E UTF-8 /usr/local/var/postgresql@10
设置 C
作为默认语言环境,我没有注意到它。
为了解决这个问题,我通过 rm -rf /usr/local/var/postgresql@12
删除了初始数据,然后使用 initdb --locale=en_US.UTF-8 -E UTF-8 /usr/local/var/postgresql@12
手动重新初始化了它。现在所有数据库的默认整理是 en_US.UTF-8,一切都和以前一样。
在我们的项目中,我们使用 simple
词典对不同语言(英语、德语、希腊语、乌克兰语等)使用 PostgreSQL 的全文搜索功能。在我的本地机器 (macOS Mojave) 上,我使用 Homebrew 安装了 PostgreSQL。在尝试将 PostgreSQL 从版本 9.5.23 升级到 11.10 之后(基本上我只是删除旧版本并重新安装)我注意到当我尝试使用 to_tsvector
函数将我的文本转换为 tsvector
数据类型时使用非拉丁语言时,它会停止小写文本。如果它是基于拉丁语 (ASCII) 的,它仍然会将生成小写词位的文本小写。问题只是在我升级到版本 11 之后才出现(在我从 9.5.23 过渡升级到 10.15 之后它仍然按预期工作)。
示例(在版本 11.10、12.5、13.1 上):
SELECT to_tsvector('simple', 'Офісний Менеджер');
'Менеджер':2 'Офісний':1
SELECT to_tsvector('simple', 'Ελληνικά');
'Ελληνικά':1
SELECT ts_lexize('simple', 'Менеджер');
{Менеджер}
SELECT ts_lexize('simple', 'Manager');
{manager}
这是以前的样子(在版本 9.5.23 和 10.15 上):
SELECT to_tsvector('simple', 'Офісний Менеджер');
'менеджер':2 'офісний':1
SELECT to_tsvector('simple', 'Ελληνικά')
'ελληνικά':1
SELECT ts_lexize('simple', 'Менеджер');
{менеджер}
SELECT ts_lexize('simple', 'Manager');
{manager}
我尝试阅读所有发行说明,但没有看到与我的问题相关的任何内容。在 docs 中仍然声明
The simple dictionary template operates by converting the input token to lower case...
所以我假设 API 本身没有变化。
我怀疑他们在版本 11 中更改了一些影响此设置的默认配置参数,但我找不到任何有用的东西。
更新:
运行 \l
in psql shell 给了我以下内容。
# 11.10
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
--------------------+-----------------+----------+---------+-------+-------------------------------------
postgres | dmytrosavochkin | UTF8 | C | C |
template0 | dmytrosavochkin | UTF8 | C | C | =c/dmytrosavochkin +
| | | | | dmytrosavochkin=CTc/dmytrosavochkin
template1 | dmytrosavochkin | UTF8 | C | C | =c/dmytrosavochkin +
| | | | |
# 9.5.23
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
--------------------+-----------------+----------+-------------+-------------+-------------------------------------
postgres | dmytrosavochkin | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
template0 | dmytrosavochkin | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/dmytrosavochkin +
| | | | | dmytrosavochkin=CTc/dmytrosavochkin
template1 | dmytrosavochkin | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/dmytrosavochkin +
| | | | | dmytrosavochkin=CTc/dmytrosavochkin
好的,感谢@jjanes的评论我明白了(谢谢!)。
问题恰好出在Homebrew postgresql公式的设置上。基本上,当我安装 postgresql@9.5 时,它是 运行 initdb /usr/local/var/postgresql@9.5
来初始化集群,但是当我切换到 11.10 时,它是 运行 initdb --locale=C -E UTF-8 /usr/local/var/postgresql@10
设置 C
作为默认语言环境,我没有注意到它。
为了解决这个问题,我通过 rm -rf /usr/local/var/postgresql@12
删除了初始数据,然后使用 initdb --locale=en_US.UTF-8 -E UTF-8 /usr/local/var/postgresql@12
手动重新初始化了它。现在所有数据库的默认整理是 en_US.UTF-8,一切都和以前一样。