从 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,一切都和以前一样。