use*_*719 16 sorting search-engine
我了解搜索引擎排名的基础知识,包括"反向索引","向量空间模型","余弦相似度","PageRank"等概念.
但是,当用户提交流行的查询字词时,很可能包含此术语的数百万个页面.因此,搜索引擎仍然需要实时对这些数百万页进行排序.例如,我只是尝试在Google中搜索"Barack Obama".它显示"约937,000,000结果(0.49秒)".在0.5秒内排名超过900M项目?这真让我大吃一惊!
搜索引擎如何在1秒内对如此大量的项目进行排序?任何人都可以给我一些直观的想法或指出参考?
谢谢!
更新:
如果我们确定排名是完整的,那么问题就非常重要.所提供的订购很可能是近似的.
鉴于排名结果的流动性,看起来不合理的答案可能被认为是不正确的.例如,如果网页的整个部分被排除在最高结果之外,您将不会注意到,只要它们稍后包含在内.
这为开发人员提供了几乎所有其他域中完全不可用的自由度.
要问的真正问题是 - 结果与每页分配的实际排名有多精确相符?
有两个主要因素会影响您从搜索引擎获得响应所需的时间.
首先,如果您将索引存储在硬盘上.如果您正在使用数据库,那么您很可能至少使用了硬盘.从冷启动开始,您的查询将很慢,直到这些查询所需的数据被拉入数据库缓存.
另一个是为您的热门查询提供缓存.搜索查询所需的时间比从缓存返回结果要长得多.现在,磁盘的随机访问时间太慢,因此需要将它存储在RAM中.
为了解决这两个问题,Google使用了memcached.这是一个缓存Google搜索引擎输出并向用户提供稍微旧结果的应用程序.这很好,因为大多数时候网络变化不够快,不足以成为一个问题,并且由于搜索的重叠.你几乎可以保证巴拉克奥巴马最近一直在搜查.
影响搜索引擎延迟的另一个问题是网络开销.谷歌一直在使用Linux(IIRC)的自定义变体,该变体已经过优化,可用作Web服务器.他们设法减少了开始将结果转换为查询所花费的时间.
在查询到达其服务器的那一刻,即使在Google处理完查询条件之前,服务器也会立即使用HTTP响应的标头向用户做出响应.
我相信他们也有一堆其他的伎俩.
编辑:他们还保留了已经从索引过程中排序的倒排列表(处理一次比每次查询更好).
使用这些预先排序的列表,最昂贵的操作是列表交集.虽然我很确定谷歌不依赖于向量空间模型,但是列表交集并不是它们的一个因素.
根据文献得到最好回报的模型是概率模型.例如,您可能希望查看Okapi BM25.在我的研究领域(XML检索)中,它在实践中表现相当不错.使用概率模型时,一次处理文档而不是一次处理文档往往效率更高.这意味着我们不是获取包含术语的所有文档的列表,而是查看每个文档,并根据查询中包含的术语对其进行排名(跳过没有术语的文档).
但是如果我们想要变得聪明,我们可以用不同的方式处理问题(但只有当它看起来更好时).如果有一个非常罕见的查询字词,我们可以先排名,因为它影响最大.然后我们按照下一个最佳术语进行排名,并继续,直到我们确定该文档是否可能在我们的前k个结果中.