PostgreSQL 重音 + 不区分大小写的搜索

标签 postgresql database-design indexing full-text-search case-insensitive

我正在寻找一种方法来支持不区分大小写 + 重音不区分搜索的良好性能。到目前为止,我们在使用 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/

相关文章:

php - 同时创建客户和订单时如何获取客户id?

postgresql - 如何在Rust上使用Actix创建POST方法?

sql - 如何为复杂数据建模

postgresql - Postgres 对一个非常简单的 SELECT x ... ORDER BY x 进行 Seq Scan 而不是 Index Only Scan

database - 包含两列外键的数据库表是否应该有第三列作为主键?

MySQL显示查询中使用的索引

c# - 从另一个列表中的字符串获取列表的索引

php - PHP数组索引的问题

ruby-on-rails - 具有非唯一列的 Activerecord-import upsert 到 postgres

regex - Postgresql 正则表达式匹配大写字母,支持 Unicode