在 PostgreSQL 数据库中搜索前缀

Posted

技术标签:

【中文标题】在 PostgreSQL 数据库中搜索前缀【英文标题】:Searching for a prefix in a PostgreSQL database 【发布时间】:2020-12-14 11:47:31 【问题描述】:

我目前正在编写垃圾邮件检查器。它的一个方面是坏链接检查器。 我有一个大型数据库(数百万),其中包含已知错误的 URL 前缀,并且经常扩展,我想非常快速地将我得到的任何 URL 与这个数据库进行比较- 如果内存不是问题,我可能会用 trie 做这种事情。

数据库示例:

evil.example.com innocentlookingblog.com/compromisedpage baduser@gooddomain.com

现在如果我得到的 URL 是 innocentlookingblog.com/compromisedpage/you-have-won.exe,我想快速确定它是一个错误的 URL,因为 innocentlookingblog.com/compromisedpage 是一个前缀。

在 PostgreSQL 中有没有好的方法来做到这一点?据我所知,似乎没有一种索引类型是为这种表包含前缀而数据包含全文的搜索而设计的。

【问题讨论】:

【参考方案1】:

您可以使用过滤条件来减少匹配的数量。假设所有前缀的长度至少为 10 个字符,请创建此索引:

CREATE INDEX ON spammers (substr(prefix, 1, 10));

然后查询喜欢

SELECT count(*) FROM spammers
WHERE substr(prefix, 1, 10) = substr('theurl.com/something', 1, 10)
  AND 'theurl.com/something' LIKE prefix || '%';

第一个条件可以使用索引,会大大减少命中次数。

【讨论】:

以上是关于在 PostgreSQL 数据库中搜索前缀的主要内容,如果未能解决你的问题,请参考以下文章

为 Django 全文搜索创建索引

在 postgresql 中显示主表列表

使用 PostgreSQL 在 SORM 中进行非敏感搜索

在 PostgreSQL 中搜索 jsonb 数组

值为 post data 的 API 路由前缀

如何从 Elasticsearch 中的数组中搜索数据的前缀?