在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解决吗?先谢谢你了!
1条答案
按热度按时间sc4hvdpw1#
我认为这是波兰语归类定义中的一个ICU错误。在他们的bug数据库中进行网络搜索,发现了this,它链接到that,这似乎是开放的,但我不确定这是否是你遇到的问题。
作为一种解决方法,您可以使用正常的确定性排序规则
"pl-PL-x-icu"
定义列,并在相等比较中明确排序规则:对于所有其他目的,正常的排序规则就可以了。