在 PostgreSQL 中使用区分重音的排序进行不区分重音的搜索

问题描述 投票:0回答:1

在 PostgreSQL 12+ 中,可以使用非确定性 ICU 排序规则来实现不区分重音的搜索 (请参阅此 StackOverflow 答案)。

我想实现accent insensitive search,同时仍然使用accent sensitive sorting


考虑以下示例:

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

  • lubuskie
  • łódzkie
  • 小波兰

值已按预期顺序列出,因为波兰字母顺序为 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 解决这个问题吗?提前致谢!

sql postgresql localization full-text-search
1个回答
0
投票

我会说这是波兰排序规则定义中的一个 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';

对于所有其他目的,正常的整理就可以了。

© www.soinside.com 2019 - 2024. All rights reserved.