这实际上是我正在处理的一个真正的问题,但为了简单起见,我们假装我是Google。什么是算法来搜索索引的多个值?
假设用户搜索“nanoscale tupperware”。没有很多页面,只有大约3k。但是,有200万页“纳米级”和400万“特百惠”。尽管如此,谷歌在0.3秒内为我找到了3k。
它是如何做到的?
我知道的唯一算法是获取“nanoscale”的文档,获取“tupperware”的文档,然后执行列表合并。但那是O(N + M),或者O(5,000,000),看起来有点慢。特别是如果我在桌面上运行它而不是超高速集群。
那么Google究竟在做什么,他们的速度主要是因为他们在他们的大规模分布式集群上运行这种昂贵的计算?
或者有没有更好的算法,我不知道?维基百科和谷歌没有为我提供任何东西。
编辑:
由于人们似乎把重点放在我的问题的谷歌方面,我想我会在实际的条款再说一遍。
我有几个非常大的(数百万项)索引实现为键/值对。键是简单的词,值是文档集。一个常见的用例是在不同索引上对多个搜索结果进行交集:难点在于获取文档集的交集。
我可以重新实现我的索引,但是我想要的 - 这主要是一个学术项目。
可能有很多巧妙的缓存涉及...... – 2010-02-22 19:05:16
我确信有,以及一百万其他聪明的优化。但我真的怀疑他们正在缓存搜索结果*,所以我仍然好奇 - 他们使用什么算法来实际获取结果列表? – levand 2010-02-22 19:10:05
谷歌有索引。很多指数。可能是抓住预先生成的单词'nanoscale'的索引,然后为列出的每个页面查看预先生成的该页面中所有单词的排序列表,以查看是否发生“tupperware”。这部分将大规模分发。它会缓存结果,以便下次搜索相同的术语时,它只会抓取预先生成的“纳米级特百惠”索引。可以想象,谷歌已经预先生成了按频率排列的前10,000个英语单词中的任何两个的每个可能组合的索引:它仅“是”1亿个页面列表。 – 2010-02-22 19:10:49