我正在寻找一种方法来支持不区分大小写 + 重音不区分搜索的良好性能。到目前为止,我们在使用 MSSql 服务器时没有遇到任何问题,在 Oracle 上我们必须使用 OracleText
,而现在我们在 PostgreSQL 上需要它。
我找到了 this post关于它,但我们需要将它与不区分大小写结合起来。我们还需要使用索引,否则性能可能会受到影响。 关于大型数据库的最佳方法的任何实际经验?
最佳答案
如果您需要“不区分大小写”,有多种选择,具体取决于您的具体要求。
也许最简单,使表达式索引不区分大小写。
以引用答案中列出的函数 f_unaccent()
为基础:
CREATE INDEX users_lower_unaccent_name_idx ON users(<b>lower(</b>f_unaccent(name)<b>)</b>);
然后:
SELECT *
FROM users
WHERE lower(f_unaccent(name)) = lower(f_unaccent('João'));
或者您可以将 lower()
构建到函数 f_unaccent()
中,以派生类似 f_lower_unaccent()
.
或者(特别是如果您无论如何都需要进行模糊模式匹配)您可以使用附加模块提供的三元组索引 pg_trgm
基于上述功能,它还支持 ILIKE
。详情:
我在 referenced answer 中添加了注释.
或者您可以使用额外的模块citext
(但我宁愿避免它):
关于PostgreSQL 重音 + 不区分大小写的搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28627951/