PostgreSQL中的重音不敏感搜索和重音敏感排序

tjvv9vkg  于 2023-05-17  发布在  PostgreSQL
关注(0)|答案(1)|浏览(124)

在PostgreSQL 12+中,可以使用非确定性ICU排序规则来实现重音不敏感搜索(请参阅StackOverflow回答)。
我想实现重音不敏感搜索,同时仍然使用重音敏感排序

考虑以下示例:

我有一个名为country_region的表,其中只有一列:“symbol”。它存储以下值:

  • 卢布斯基
  • 沃日凯
  • 小波兰

这些值已按预期顺序列出,因为波兰字母顺序是L ->-> M。
下面的SQL查询应该返回“łódzkie”字段,忽略变音符号:

SELECT * FROM country_region WHERE symbol = 'lodzkie'

下面的SQL查询应该返回按字母表排序的值(lubuskie -> łódzkie -> małopolskie):

SELECT * FROM country_region ORDER BY symbol
What I have tried

我试过使用两个不同的ICU区域。
在下面的排序规则中,Unicode区域设置搜索按预期工作,但行的排序顺序错误:

CREATE COLLATION ignore_accent (provider = icu, locale = 'und-u-ks-level1-kc-true', deterministic = FALSE);
CREATE INDEX test_index ON country_region(symbol COLLATE ignore_accent);

在下面的排序规则中,波兰语语言环境排序按预期工作,但在搜索中不会忽略变音符号:

CREATE COLLATION ignore_accent (provider = icu, locale = 'pl-u-ks-level1-kc-true', deterministic = FALSE);
CREATE INDEX test_index ON country_region(symbol COLLATE ignore_accent);

这个问题可以用PostgreSQL解决吗?先谢谢你了!

sc4hvdpw

sc4hvdpw1#

我认为这是波兰语归类定义中的一个ICU错误。在他们的bug数据库中进行网络搜索,发现了this,它链接到that,这似乎是开放的,但我不确定这是否是你遇到的问题。
作为一种解决方法,您可以使用正常的确定性排序规则"pl-PL-x-icu"定义列,并在相等比较中明确排序规则:

CREATE COLLATION ignore_accent (
   provider = icu,
   locale = 'und-u-ks-level1-kc-true',
   deterministic = FALSE
);

CREATE INDEX test_index ON country_region(symbol COLLATE ignore_accent);

SELECT * FROM country_region WHERE symbol COLLATE ignore_accent = 'lodzkie';

对于所有其他目的,正常的排序规则就可以了。

相关问题