architecture - google是如何返回这么多搜索结果的呢?

标签 architecture search-engine

当我们用谷歌搜索某个术语时,我们被告知我们在数千个结果中看到了 k 的 10 个结果。即 10000 个结果中的第 1-10 个结果。 我们可以直接跳到第 50-60 个结果,谷歌将在不到一秒的时间内返回它们。 如果 google 缓存所有 1-40,我想它会浪费 RAM。如果一次性返回所有结果,就会浪费流量。 谷歌如何在排序时返回如此多的搜索结果?

最佳答案

这是我尝试过的: 对于谷歌搜索:

How google search engine works

这是发送到服务器的 URL:

https://www.google.co.in/?gws_rd=cr#gs_rn=20&gs_ri=psy-ab&tok=v1e-J_ynDKaPw_oDlFH-HA&cp=30&gs_id=8&xhr=t&q=how+google+search+engine+works&es_nrs=true&pf=p&output=search&sclient=psy-ab&oq=how+google+search+engine+works&gs_l=&pbx=1&bav=on.2,or.r_cp.r_qf.&bvm=bv.49478099,d.bmk&fp=56e0e38cda57afa7&biw=1280&bih=899

如果我选择页面底部的第 5 页链接,则这是正在发送的 url:

https://www.google.co.in/?gws_rd=cr#q=how+google+search+engine+works&ei=qm3qUeXSA4LqrAfXtYDoCg&sqi=2&start=40&sa=N&bav=on.2,or.r_cp.r_qf.&bvm=bv.49478099%2Cd.bmk%2Cpv.xjs.s.en_US.c75bKy5EQ0A.O&fp=56e0e38cda57afa7&biw=1280&bih=899

请注意此处的附加 start=40&sa=N 参数。

那么我经历之后的感受是google search enging working第 2 步(共 3 步):Google 对于超过 30 万亿个网页有自己的索引,并且对于每个查询,他们使用 200 多个因素对结果进行排名。所以我觉得 startsa 参数在获取结果时形成了这些因素之一。

因此我的观点是谷歌不会缓存结果,而是使用不同的网址参数对每个查询进行新的搜索。

编辑:

为了进一步支持我的观察,这里列出了导航到上述搜索查询的不同页面所需的时间:

  1. 首页:157,000,000 个结果(0.22 秒)
  2. 对于第 5 页:第 5 页,约 157,000,000 个结果(0.26 秒)
  3. 第 10 页:第 10 页,约 157,000,000 个结果(0.30 秒)

  4. 第 14 页:第 14 页约 157,000,000 个结果(0.33 秒)

  5. 第 18 页:第 18 页,约 157,000,000 个结果(0.38 秒)
  6. 第 22 页:第 22 页,约 157,000,000 个结果(0.35 秒)
  7. 第 26 页:第 26 页,约 157,000,000 个结果(0.43 秒)
  8. 第 30 页:第 30 页,约 157,000,000 个结果(0.45 秒)
  9. 第 34 页:第 34 页,约 157,000,000 个结果(0.40 秒)
  10. 第 38 页:第 38 页,共约 371 个结果(0.50 秒)

因此,随着查询页数的增加,时间几乎在增加。如果它缓存结果,则不会出现上述趋势。

关于architecture - google是如何返回这么多搜索结果的呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17761448/

相关文章:

database - 存储倒排索引

c - 使用编辑距离生成摘录

java - 使用多种编程语言(Python Java C#)构建用于开发 Web 应用程序的基础架构

oop - 与过程式编程相比,使用事件驱动方法有什么优势?

architecture - ATM 机的数据系统是否使用最终一致性?

Android MVP - 将字符串资源从演示者传递到 View

mod-rewrite - 我可以在网址中使用 ö 或 å 等瑞典语字符吗?

asp.net-mvc-2 - 搜索引擎如何索引 Restful 多语言网站

solr - 使用两个日期字段的Elasticsearch daterange

c# - 服务类应该引用其他服务类还是只引用其他存储库类?