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

Rob*_*ert 3 postgresql indexing database-design full-text-search case-insensitive

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

我发现这篇关于重音不敏感的帖子:
PostgreSQL是否支持"重音不敏感"排序?

但我们需要将它与不区分大小写结合起来.我们还需要使用索引,否则可能会影响性能.有关大型数据库最佳方法的真实经验吗?

Erw*_*ter 6

如果您需要"结合不区分大小写",则有多种选择,具体取决于您的具体要求.

也许最简单,使表达式索引不区分大小写.

建立在f_unaccent()参考答案中列出的功能:

CREATE INDEX users_lower_unaccent_name_idx ON users(lower(f_unaccent(name)));
Run Code Online (Sandbox Code Playgroud)

然后:

SELECT *
FROM   users
WHERE  lower(f_unaccent(name)) = lower(f_unaccent('João'));
Run Code Online (Sandbox Code Playgroud)

或者您可以构建lower()函数f_unaccent(),以获得类似的东西f_lower_unaccent().

或者(特别是如果你需要进行模糊模式匹配)你可以使用由上面函数构建的附加模块pg_trgm提供的三元组索引,它也支持ILIKE.细节:

我在参考答案中添加了一个注释.

或者您可以使用附加模块citext:


Eva*_*oll 5

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

\n\n

FTS默认情况下自然不区分大小写,

\n\n
\n

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

\n
\n\n

您可以使用定义您自己的字典unaccent

\n\n
CREATE EXTENSION unaccent;\n\nCREATE TEXT SEARCH CONFIGURATION mydict ( COPY = simple );\nALTER TEXT SEARCH CONFIGURATION mydict\n  ALTER MAPPING FOR hword, hword_part, word\n  WITH unaccent, simple;\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后您可以使用功能索引对其进行索引,

\n\n
-- Just some sample data...\nCREATE TABLE myTable ( myCol )\n  AS VALUES (\'f\xc3\xb3\xc3\xb3 bar baz\'),(\'qux quz\');\n\n-- No index required, but feel free to create one\nCREATE INDEX ON myTable\n  USING GIST (to_tsvector(\'mydict\', myCol));\n
Run Code Online (Sandbox Code Playgroud)\n\n

您现在可以非常简单地查询它

\n\n
SELECT *\nFROM myTable\nWHERE to_tsvector(\'mydict\', myCol) @@ \'foo & bar\'\n\n    mycol    \n-------------\n f\xc3\xb3\xc3\xb3 bar baz\n(1 row)\n
Run Code Online (Sandbox Code Playgroud)\n\n

也可以看看

\n\n\n