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

PostgreSQL口音+;不区分大小写的搜索,postgresql,database-design,indexing,full-text-search,case-insensitive,Postgresql,Database Design,Indexing,Full Text Search,Case Insensitive,我正在寻找一种方法来支持具有良好性能的不区分大小写+不区分重音的搜索。到目前为止,我们使用MSSql server在这方面没有问题,在Oracle上我们必须使用OracleText,现在我们在PostgreSQL上需要它 我发现了这篇关于不区分重音的帖子: 但我们需要将其与案例不敏感相结合。我们还需要使用索引,否则性能可能会受到影响。 有没有关于大型数据库的最佳方法的实际经验?如果您需要“结合不区分大小写”,根据您的具体要求,有许多选择 也许最简单的方法是使表达式索引不区分大小写 基于参考答案

我正在寻找一种方法来支持具有良好性能的不区分大小写+不区分重音的搜索。到目前为止,我们使用MSSql server在这方面没有问题,在Oracle上我们必须使用
OracleText
,现在我们在PostgreSQL上需要它

我发现了这篇关于不区分重音的帖子:

但我们需要将其与案例不敏感相结合。我们还需要使用索引,否则性能可能会受到影响。 有没有关于大型数据库的最佳方法的实际经验?

如果您需要“结合不区分大小写”,根据您的具体要求,有许多选择

也许最简单的方法是使表达式索引不区分大小写

基于参考答案中列出的函数
f_uncent()

您可以将
lower()
构建到函数
f\u uncent()
中,以派生类似
f\u lower\u uncent()
的内容

(特别是如果您需要进行模糊模式匹配),您可以使用基于上述函数的附加模块提供的三叉图索引,该模块还支持
ILIKE
。详情:

我在信上加了一张便条

您可以使用附加模块:

不区分大小写的全文搜索词典

将标记转换为词素。词素是一个字符串,就像一个标记一样,但它已被规范化,因此同一单词的不同形式是相同的。例如,规范化几乎总是包括将大写字母折叠成小写字母,并且通常包括删除后缀(例如英语中的s或es)

您可以使用
uncent
定义自己的词典

CREATE EXTENSION unaccent;

CREATE TEXT SEARCH CONFIGURATION mydict ( COPY = simple );
ALTER TEXT SEARCH CONFIGURATION mydict
  ALTER MAPPING FOR hword, hword_part, word
  WITH unaccent, simple;
然后可以使用函数索引对其进行索引

-- Just some sample data...
CREATE TABLE myTable ( myCol )
  AS VALUES ('fóó bar baz'),('qux quz');

-- No index required, but feel free to create one
CREATE INDEX ON myTable
  USING GIST (to_tsvector('mydict', myCol));
您现在可以非常简单地查询它

SELECT *
FROM myTable
WHERE to_tsvector('mydict', myCol) @@ 'foo & bar'

    mycol    
-------------
 fóó bar baz
(1 row)
另见


您是否检查了PostgreSQL中的全文搜索功能?即将发布的PostgreSQL 10版本将通过ICU排序支持增加对此的支持。这是一个很好的提示列表。我们的要求在理论上是“简单的”:如果一列包含Firstname=“Aloïse”,我们希望能够使用例如:“Aloise”或“Aloise”甚至“lois”来查找行。
-- Just some sample data...
CREATE TABLE myTable ( myCol )
  AS VALUES ('fóó bar baz'),('qux quz');

-- No index required, but feel free to create one
CREATE INDEX ON myTable
  USING GIST (to_tsvector('mydict', myCol));
SELECT *
FROM myTable
WHERE to_tsvector('mydict', myCol) @@ 'foo & bar'

    mycol    
-------------
 fóó bar baz
(1 row)