在 PostgreSQL 12+ 中,可以使用非确定性 ICU 排序规则来实现不区分重音的搜索 (请参阅此 StackOverflow 答案)。
我想实现accent insensitive search,同时仍然使用accent sensitive sorting。
我有一个名为 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
我尝试过使用 2 种不同的 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 解决这个问题吗?提前致谢!
我会说这是波兰排序规则定义中的一个 ICU 错误。在他们的错误数据库中进行网络搜索发现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';
对于所有其他目的,正常的整理就可以了。