PostgreSQL口音+;不区分大小写的搜索
我正在寻找一种方法来支持具有良好性能的不区分大小写+不区分重音的搜索。到目前为止,我们使用MSSql server在这方面没有问题,在Oracle上我们必须使用PostgreSQL口音+;不区分大小写的搜索,postgresql,database-design,indexing,full-text-search,case-insensitive,Postgresql,Database Design,Indexing,Full Text Search,Case Insensitive,我正在寻找一种方法来支持具有良好性能的不区分大小写+不区分重音的搜索。到目前为止,我们使用MSSql server在这方面没有问题,在Oracle上我们必须使用OracleText,现在我们在PostgreSQL上需要它 我发现了这篇关于不区分重音的帖子: 但我们需要将其与案例不敏感相结合。我们还需要使用索引,否则性能可能会受到影响。 有没有关于大型数据库的最佳方法的实际经验?如果您需要“结合不区分大小写”,根据您的具体要求,有许多选择 也许最简单的方法是使表达式索引不区分大小写 基于参考答案
OracleText
,现在我们在PostgreSQL上需要它
我发现了这篇关于不区分重音的帖子:但我们需要将其与案例不敏感相结合。我们还需要使用索引,否则性能可能会受到影响。 有没有关于大型数据库的最佳方法的实际经验?如果您需要“结合不区分大小写”,根据您的具体要求,有许多选择 也许最简单的方法是使表达式索引不区分大小写 基于参考答案中列出的函数
f_uncent()
:
lower()
构建到函数f\u uncent()
中,以派生类似f\u lower\u uncent()
的内容
或(特别是如果您需要进行模糊模式匹配),您可以使用基于上述函数的附加模块提供的三叉图索引,该模块还支持ILIKE
。详情:
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)
另见
-- 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)