如何快速搜索数百万字符串?

时间:2016-06-13 06:49:31

标签: php python mysql database string

情况就是这样 我们有250,000个广播电台。 每个广播电台都配有2个字符串。

这两个字符串可以是歌曲名称专辑名称艺术家名称 我们不知道哪一个是什么。但其中一个肯定是歌名,我们不知道哪个。 通常另一个是艺术家(告诉它最坏的情况,我们不想通过假设它作为专辑来创造最坏情况的情况)

现在我们有一个由450万艺术家,700万张专辑和1.5亿首歌曲组成的数据库(还有一些其他数据并不重要)这3个不同的行在不同的表格中。这些是我们将进行搜索和匹配的表格。我们可以按字母顺序对它们进行排序,或者它适合我们加快进程。

这些表是相互关联的。 在这些表格中,歌曲名称总是有一个与之相关的艺术家和专辑(在各自的表格中),一张专辑总是有艺术家/ s和与之相关的歌曲......你明白了这个想法

每个广播电台附带2个字符串,我必须识别3件事

歌曲名称

相册名称

艺术家姓名

现在我假设最好的情况是如果我们将第一个频道字符串与表格中的艺术家姓名匹配。如果我们得到一个匹配,我们可以很容易地找到另一个字符串是否与匹配的艺术家相关联的歌曲名称(和专辑名称)匹配。 (为简单起见,我们假设专辑名称不能与艺术家姓名或歌曲名称相同,反之亦然) 如果我们没有使用第一个字符串获得Artist的匹配,我们会尝试第二个字符串。如果我们没有匹配,我们会重复相同的相册。

获得最快结果的算法应该是什么? 我有一台56的服务器(已经使用了一些ram)Gb,但我想为其他目的保留20 Gb。 (但如果您可以通过使用保留提供非常好的解决方案,请不要犹豫。)

我们也有SSD存储。你认为这一切都可以在一分钟内完成所有广播电台吗?最好是30秒? 请让我知道如何继续。

以下是更好理解的图片

enter image description here

1 个答案:

答案 0 :(得分:2)

所有这些都是字符串。这是一个有趣的搜索问题,创建一个单独的特定搜索索引(类似于Trie的结构)会很好。现在出现问题,索引数据的最佳数据结构将是有限状态传感器。它比Trie更紧凑,因为在现实世界中,字符串和文本共享许多后缀,FST允许您共享后缀和前缀,想想Graphs。但是,Trie不允许您共享后缀。另外,因为你有你的键的值,所以你需要像传感器(思考有序地图)这样的东西,它发出一个给定一个键的值,而不是一个有限状态接受器,它更像是一个有序集,而不是一个类似于结构的映射。 / p>

Lucene有一个很好的实现,我想很多像建议,编辑距离都是基于它。他们还将其与主要的倒置指数分离。

有关Lucene有限状态传感器的更多信息:

http://blog.mikemccandless.com/2010/12/using-finite-state-transducers-in.html

使用Automata和Rust索引1,600,000,000个密钥:http://blog.burntsushi.net/transducers/