渐进式搜索最长前缀

Posted

技术标签:

【中文标题】渐进式搜索最长前缀【英文标题】:Progressive search for longest prefix 【发布时间】:2014-11-21 19:15:36 【问题描述】:

我有一个带有电话号码前缀列的表格,例如:

prefix
------
9379
355422
35566
...

给定一个电话号码,我想从右边开始删除它的数字,直到它在前缀列上找到第一个匹配项。即:

937973418459
93797341845
9379734184
937973418
93797341
9379734
937973
93797
9379   <-- match found

请注意,我需要为电话号码列表执行此操作,因此与缓慢的单个查询相比,批量操作很重要。我尝试使用 postgres 的全文搜索:

tsquery('937973418459|93797341845|9379734184|937973418|93797341|9379734|937973|93797|9379')

它可以工作,但在运行 10k 电话号码时速度很慢。有没有更有效的方法来解决这个问题?

【问题讨论】:

【参考方案1】:

要找到最长的前缀

对于一个单个给定的数字:

SELECT *
FROM   prefix_tbl
WHERE  937973418459 LIKE prefix || '%'
ORDER  BY prefix DESC
LIMIT  1

对于给定数字的整个表格:

SELECT DISTINCT ON (t.nr )
       p.*
FROM   prefix_tbl p
JOIN   tel_nr t ON t.nr LIKE p.prefix || '%'
ORDEr  BY t.nr, prefix DESC;

相关:

? LIKE (column || '%')

对于性能优化,请考虑在 dba.SE 上密切相关的广泛答案:

Algorithm for finding the longest prefix

还有这个:

Optimize GROUP BY query to retrieve latest record per user

【讨论】:

像魅力一样工作,链接非常棒! ;)

以上是关于渐进式搜索最长前缀的主要内容,如果未能解决你的问题,请参考以下文章

iOS上推送通知渐进式网络应用程序

论文泛读67渐进式预训练密集语料库索引用于开放域问答

VS快捷键

Visual Studio常用快捷键

VS快捷键的简单总结

在 ORACLE 中搜索最长前缀的最快方法