搜索引擎如何在1秒内排名数百万页?

时间:2013-10-03 14:34:39

标签: sorting search-engine

我了解搜索引擎排名的基础知识,包括“反向索引”,“向量空间模型”,“余弦相似度”,“PageRank”等概念。

但是,当用户提交热门查询字词时,很可能包含此术语的数百万页。因此,搜索引擎仍然需要实时对这些数百万页进行排序。例如,我只是尝试在Google中搜索“Barack Obama”。它显示“约937,000,000结果(0.49秒)”。在0.5秒内排名超过900M项目?这真让我大吃一惊!

搜索引擎如何在1秒内对如此大量的项目进行排序?任何人都可以给我一些直观的想法或指出参考文献吗?

谢谢!

更新:

  1. 到目前为止,大多数回复(包括一些较旧的讨论)似乎都归功于“反向指数”。但是,据我所知,反向索引只能帮助找到“相关页面”。换句话说,通过反向索引谷歌可以获得包含“巴拉克奥巴马”的900M页面(超过几十亿页)。但是,根据我目前读到的主题,仍然不清楚如何“排名”数百万个“相关页面”
  2. MapReduce框架不太可能成为实时排名的关键组件。 MapReduce是专为批量任务设计的。在向MapReduce框架提交作业时,响应时间通常至少为一分钟,这显然太慢,无法满足我们的要求。

11 个答案:

答案 0 :(得分:7)

如果我们确定排名已经完成,那么这个问题就非常重要。所提供的订购很可能是近似的。

鉴于排名结果的流动性,看起来不合理的答案可能被认为是不正确的。例如,如果网页的整个部分被排除在最高结果之外,您将不会注意到,只要它们稍后包含在内。

这为开发人员提供了几乎所有其他域中完全不可用的自由度。

要问的真正问题是 - 结果与分配给每个页面的实际排名的准确程度

答案 1 :(得分:6)

有两个主要因素会影响您从搜索引擎获得回复所需的时间。

首先,如果您将索引存储在硬盘上。如果您正在使用数据库,那么您很可能至少使用了硬盘。从冷启动开始,您的查询将很慢,直到这些查询所需的数据被拉入数据库缓存。

另一个是为您的热门查询提供缓存。搜索查询所需的时间比从缓存返回结果要长得多。现在,磁盘的随机访问时间太慢,因此需要将它存储在RAM中。

为了解决这两个问题,Google使用了memcached。这是一个缓存Google搜索引擎输出并向用户提供稍微旧结果的应用程序。这很好,因为大多数时候网络变化不够快,不足以成为一个问题,并且由于搜索的重叠。你几乎可以保证巴拉克奥巴马最近一直在搜查。

影响搜索引擎延迟的另一个问题是网络开销。 谷歌一直在使用Linux(IIRC)的自定义变体,该变体已经过优化,可用作Web服务器。他们设法减少了开始将结果转换为查询所花费的时间。

当查询到达其服务器时,即使在Google处理完查询条件之前,服务器也会立即使用HTTP响应的标头回复用户。

我确信他们也有很多其他的伎俩。

编辑: 他们还从索引过程中对已经倒置的列表进行了排序(最好处理一次,而不是每次查询)。

使用这些预先排序的列表,最昂贵的操作是列表交集。虽然我很确定谷歌不依赖于向量空间模型,但列表交集并不是它们的一个因素。

根据文献得到最好回报的模型是概率模型。例如,您可能希望查看Okapi BM25。在我的研究领域(XML检索)中,它在实践中表现相当不错。使用概率模型时,一次处理文档而不是一次处理文档往往效率更高。这意味着我们不是获取包含术语的所有文档的列表,而是查看每个文档,并根据查询中包含的术语对其进行排名(跳过没有术语的文档)。

但是如果我们想变得聪明,我们可以用不同的方式处理问题(但只有当它看起来更好时)。如果有一个非常罕见的查询字词,我们可以先排名,因为它影响最大。然后我们按照下一个最佳术语进行排名,并继续,直到我们确定该文档是否可能在我们的前k个结果中。

答案 2 :(得分:5)

一种可能的策略是排名前k而不是整个列表。

例如,要查找来自1百万次点击的前100个结果,按selection algorithm,时间复杂度为O( n log k )。由于 k = 100且 n = 1,000,000,实际上我们可以忽略log( k )。

现在,您只需要O( n )即可获得100万次点击中的前100个结果。

答案 3 :(得分:1)

在这里,我为你查找,这就是我找到的! http://computer.howstuffworks.com/internet/basics/search-engine.htm

答案 4 :(得分:1)

另外我想使用NoSQL数据库而不是RDBMS有帮助。

NoSQL数据库水平扩展更好,并且不会产生瓶颈。 Google Facebook或Twitter等大公司都会使用它们。

正如其他评论/答案所暗示的那样,数据可能已经排序,而且他们正在返回找到的数据的偏移而不是整批。

真正的问题不是他们如何快速排序那么多结果,而是当全世界数万或数亿人同时查询谷歌时他们如何做到这一点xD

答案 5 :(得分:1)

正如肖所说,只是排名前k而不是整个名单。

谷歌告诉你有937,000,000个结果,但它不会全部显示给你。如果你继续一页一页地滚动,一段时间后会截断结果:)

答案 6 :(得分:0)

这就是我的理论......你是第一个搜索关键词的人是非常不可能的。因此,对于在搜索引擎上搜索的每个关键词(或组合),它都会保留一个链接到相关网页的链接。每次单击搜索结果中的链接时,它都会对该关键字组合的哈希集进行投票。不幸的是,如果您是第一个人,它会保存您的搜索关键字(用于建议将来的搜索)并启动该关键字的散列。所以你最终会得到更少或没有结果。 您可能知道的页面排名取决于许多其他因素,如反向链接,不。在seaech中引用关键字的页面。等

答案 7 :(得分:0)

关于您的更新:

  

MapReduce框架不太可能成为实时排名的关键组件。 MapReduce专为批量任务而设计。在向MapReduce框架提交作业时,响应时间通常至少为一分钟,这显然太慢,无法满足我们的要求。

MapReduce不仅适用于批处理任务。有很多MapReduce框架支持实时计算:Apache SparkStormInfinispan Distributed ExecutorHazelcast Distributed Executor Service

回到您的问题MapReduce是将查询任务分发到多个节点,然后将结果合并在一起的关键。

答案 8 :(得分:0)

你不可能期望在这里得到这个问题的准确答案;)无论如何,这里有几件事需要考虑 - 谷歌在其每个部分都使用独特的基础设施。我们甚至无法猜测其网络设备或其数据库存储的复杂程度。这就是我所知道的关于这个问题的硬件组件。

现在,对于软件实现 - 就像名称所说PageRank本身就是一个排名。输入搜索查询时,它不会对页面进行排名。我假设它每小时将它排在完全独立的基础设施部分。我们已经知道Google抓取工具机器人正在全天候漫游网络,因此我假设新页面被添加到“未排序”的哈希映射中,然后它们会在下一次运行算法时进行排名。

接下来,当您键入查询时,数千个CPU使用间隙因子独立扫描PageRank数据库的数千个不同部分。例如,如果间隙因子为10,则一台机器查询数据库中具有0-9.99的PageRank值的部分,另一台查询数据库的数据从10-19.99等。由于资源不是谷歌的障碍,他们可以设置间隙因子如此之低(例如1),以便每台机器查询少于100k的页面,这对于他们的硬件而言并不多。然后,当他们需要编译查询结果时,因为他们知道哪台机器确切地对数据库的哪个部分进行排名,所以他们可以使用“fill the pool”原则。让 n 为每个Google网页上的链接数量。将所有这些计算机上运行的查询返回的页面组合在一起的算法与数据库的所有不同部分相比,只需填充第一个 n 结果。因此,他们将机器查询的结果与数据库的最高级别进行查询。如果它大于 n 它们已经完成,如果不是,它们就会移动到下一台机器。这只需要 O(q * g / r),其中 s 是Google服务的网页数量, g 是间隙因子,< strong> r 是PageRank的最高值。当您转向第二页时,您的查询再次运行(请注意生成它所用的不同时间)这一事实鼓励了这一假设。

这只是我的两分钱,但我认为我对这个假设非常准确。

编辑:您可能希望check this out了解高阶查询的复杂性。

答案 9 :(得分:0)

我有一个单词的答案:QuickSort!

答案 10 :(得分:0)

我不知道谷歌究竟做了什么,但他们肯定会使用近似值。例如,如果搜索查询是“搜索引擎”,那么结果的数量将是=(文档的数量,其中存在一个或多个出现的单词'search'+ no。的文档,其中有一个或多个出现“引擎”这个词。这可以在O(1)时间复杂度中完成。有关详细信息,请阅读Google http://infolab.stanford.edu/~backrub/google.html的基本结构。