Rob*_*ert 3 postgresql indexing database-design full-text-search case-insensitive
我正在寻找一种支持良好性能不区分大小写+重音不敏感搜索的方法.到目前为止,我们使用MSSql服务器没有问题,我们必须使用Oracle OracleText
,现在我们需要在PostgreSQL上使用它.
我发现这篇关于重音不敏感的帖子:
PostgreSQL是否支持"重音不敏感"排序?
但我们需要将它与不区分大小写结合起来.我们还需要使用索引,否则可能会影响性能.有关大型数据库最佳方法的真实经验吗?
如果您需要"结合不区分大小写",则有多种选择,具体取决于您的具体要求.
也许最简单,使表达式索引不区分大小写.
建立在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:
\n\n\n将标记转换为词位。词位是一个字符串,就像一个标记一样,但它已经被标准化,以便同一单词的不同形式变得相似。例如,规范化几乎总是包括将大写字母折叠为小写,并且通常涉及删除后缀(例如英语中的 s 或 es)。
\n
您可以使用定义您自己的字典unaccent
,
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\nSELECT *\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