Google搜索为什么不能无限分页?

Google搜索为什么不能无限分页?

这是一个很有意思却很少有人注意的问题。

当我用Google搜索 MySQL这个关键词的时候,Google只提供了 13页的搜索结果,我通过修改url的分页参数试图搜索第 14页数据,结果出现了以下的错误提示:

Google搜索为什么不能无限分页?

百度搜索同样不提供无限分页,对于 MySQL关键词,百度搜索提供了 76页的搜索结果。

Google搜索为什么不能无限分页?

为什么不支持无限分页

强如Google搜索,为什么不支持无限分页?无非有两种可能:

  • 做不到
  • 没必要

「做不到」是不可能的,唯一的理由就是「没必要」。

首先,当第1页的搜索结果没有我们需要的内容的时候,我们通常会立即更换关键词,而不是翻第2页,更不用说翻到10页往后了。这是没必要的第一个理由——用户需求不强烈。

其次,无限分页的功能对于搜索引擎而言是非常消耗性能的。你可能感觉很奇怪,翻到第2页和翻到第1000页不都是搜索嘛,能有什么区别?

实际上,搜索引擎高可用和高伸缩性的设计带来的一个副作用就是无法高效实现无限分页功能,无法高效意味着能实现,但是代价比较大,这是所有搜索引擎都会面临的一个问题,专业上叫做「 深度分页」。这也是没必要的第二个理由——实现成本高。

我自然不知道Google的搜索具体是怎么做的,因此接下来我用 ES(Elasticsearch)为例来解释一下为什么深度分页对搜索引擎来说是一个头疼的问题。

为什么拿ES举例子

Elasticsearch(下文简称 ES)实现的功能和Google以及百度搜索提供的功能是相同的,而且在实现高可用和高伸缩性的方法上也大同小异,深度分页的问题都是由这些大同小异的优化方法导致的。

什么是ES

ES是一个全文搜索引擎。

全文搜索引擎又是个什么鬼?

试想一个场景,你偶然听到了一首旋律特别优美的歌曲,回家之后依然感觉余音绕梁,可是无奈你只记得一句歌词中的几个字:「 伞的边缘」。这时候搜索引擎就发挥作用了。

使用搜索引擎你可以获取到带有「 伞的边缘」关键词的所有结果,这些结果有一个术语,叫做文档。并且搜索结果是按照文档与关键词的相关性进行排序之后返回的。我们得到了全文搜索引擎的定义:

全文搜索引擎是 根据文档内容查找相关文档,并按照 相关性顺序返回搜索结果的一种工具

Google搜索为什么不能无限分页?

网上冲浪太久,我们会渐渐地把计算机的能力误以为是自己本身具备的能力,比如我们可能误以为我们大脑本身就很擅长这种搜索。恰恰相反,全文检索的功能是我们非常不擅长的。

举个例子,如果我对你说:静夜思。你可能脱口而出:床前明月光,疑是地上霜。举头望明月,低头思故乡。但是如果我让你说出带有「月」的古诗,想必你会费上一番功夫。

包括我们平时看的书也是一样,目录本身就是一种符合我们人脑检索特点的一种搜索结构,让我们可以通过文档ID或者文档标题这种总领性的标识来找到某一篇文档,这种结构叫做 正排索引

Google搜索为什么不能无限分页?

而全文搜索引擎恰好相反,是通过文档中的内容来找寻文档,诗词大会中的飞花令就是人脑版的全文搜索引擎。

Google搜索为什么不能无限分页?

全文搜索引擎依赖的数据结构就是大名鼎鼎的 倒排索引(「倒排」这个词就说明这种数据结构和我们正常的思维方式恰好相反),它是单词和文档之间包含关系的一种具体实现形式。

Google搜索为什么不能无限分页?

打住!不能继续展开了话题了,赶紧一句话介绍完ES吧!

ES是一款 使用倒排索引数据结构、能够根据文档内容查找相关文档,并按照 相关性顺序返回搜索结果的全文搜索引擎

高可用的秘密——副本(Replication)

高可用是企业级服务必须考虑的一个指标,高可用必然涉及到集群和分布式,好在ES天然支持集群模式,可以非常简单地搭建一个分布式系统。

ES服务高可用要求其中一个节点如果挂掉了,不能影响正常的搜索服务。这就意味着挂掉的节点上存储的数据,必须在 其他节点上留有完整的备份。这就是副本的概念。

Google搜索为什么不能无限分页?

如上图所示, Node1作为主节点, Node2Node3作为副本节点保存了和主节点完全相同的数据,这样任何一个节点挂掉都不会影响业务的搜索。满足服务的高可用要求。

但是有一个致命的问题,无法实现系统扩容!即使添加另外的节点,对整个系统的容量扩充也起不到任何帮助。因为每一个节点都完整保存了所有的文档数据。

因此, ES引入了分片( Shard)的概念。

PB级数量的基石——分片(Shard)

ES将每个索引( ES中一系列文档的集合,相当于 MySQL中的表)分成若干个分片,分片将 尽可能平均地分配到不同的节点上。比如现在一个集群中有3台节点,索引被分成了5个分片,分配方式大致(因为具体如何平均分配取决于 ES)如下图所示。

Google搜索为什么不能无限分页?

这样一来,集群的横向扩容就非常简单了,现在我们向集群中再添加2个节点,则 ES会自动将分片均衡到各个节点之上:

Google搜索为什么不能无限分页?

高可用 + 弹性扩容

副本和分片功能通力协作造就了 ES如今 高可用支持PB级数据量的两大优势。

现在我们以3个节点为例,展示一下分片数量为 5,副本数量为 1的情况下, ES在不同节点上的分片排布情况:

Google搜索为什么不能无限分页?

有一点需要注意,上图示例中主分片和对应的副本分片不会出现在同一个节点上,至于为什么,大家可以自己思考一下。

文档的分布式存储

ES是怎么确定某个文档应该存储到哪一个分片上呢?

Google搜索为什么不能无限分页?

通过上面的映射算法, ES将文档数据均匀地分散在各个分片中,其中 routing默认是文档id。

此外,副本分片的内容依赖主分片进行同步,副本分片存在意义就是负载均衡、顶上随时可能挂掉的主分片位置,成为新的主分片。

现在基础知识讲完了,终于可以进行搜索了。

ES的搜索机制

一图胜千言:

Google搜索为什么不能无限分页?
  1. 客户端进行关键词搜索时, ES会使用负载均衡策略选择一个节点作为协调节点( Coordinating Node)接受请求,这里假设选择的是 Node3节点;
  2. Node3节点会在10个主副分片中随机选择5个分片(所有分片必须能包含所有内容,且不能重复),发送search request;
  3. 被选中的5个分片分别执行查询并进行排序之后返回结果给 Node3节点;
  4. Node3节点整合5个分片返回的结果,再次排序之后取到对应分页的结果集返回给客户端。

注:实际上 ES的搜索分为 Query阶段Fetch阶段两个步骤,在 Query阶段各个分片返回文档Id和排序值, Fetch阶段根据文档Id去对应分片获取文档详情,上面的图片和文字说明对此进行了简化,请悉知。

现在考虑客户端获取 990~1000的文档时, ES在分片存储的情况下如何给出正确的搜索结果。

获取 990~1000的文档时, ES在每个分片下都需要获取 1000个文档,然后由 Coordinating Node聚合所有分片的结果,然后进行相关性排序,最后选出相关性顺序在 990~100010条文档。

Google搜索为什么不能无限分页?

页数越深,每个节点处理的文档也就越多,占用的内存也就越多,耗时也就越长,这也就是为什么搜索引擎厂商通常不提供深度分页的原因了,他们没必要在客户需求不强烈的功能上浪费性能。

公众号「蝉沐风」,关注我,邂逅更多精彩文章

完。

Original: https://www.cnblogs.com/chanmufeng/p/16359344.html
Author: 蝉沐风
Title: Google搜索为什么不能无限分页?

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/712518/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 如何成为一名优秀的博主(PPT)

    如何成为一名优秀的博主?这是一个问题。我一直到处建议别人写博客,写技术博客,但是还真没想过或总结过这个问题。上个星期微软”社区经营计划”讲解了微软内部关于撰…

    技术杂谈 2023年5月31日
    0121
  • Java同步容器之Vector源码分析

    一、简述 Vector的操作单线安全,加入了同步代码块,多线程安全(但不绝对),可以看成线程安全版本的 ArrayList(其实也不绝对,在使用还是会加锁操作)。 相比于 Arra…

    技术杂谈 2023年7月24日
    0105
  • mac iterm2配置ssh自动登陆

    下载并安装好iterm2 配置过程: https://blog.csdn.net/hu_feng903/article/details/104077950 https://www….

    技术杂谈 2023年5月31日
    079
  • CWE4.8:2022年危害最大的25种软件安全问题

    摘要:我们来看下新版的《2022年危害最大的25种安全问题》在安全预防上会给了我们哪些安全提示。 1. CWE 4.8的变化 2022年过了一半了,继《CWE 4.7中的新视图 –…

    技术杂谈 2023年5月31日
    0132
  • 猪齿鱼开源四周年庆典,邀您共享精彩瞬间

    520真情相遇,「猪齿鱼」与你相伴, 从此一番过往皆是你! 在这样一个充满爱与温馨的日子里,「猪齿鱼」也迎来了自己四周岁的生日。小伙伴们,让我们一起坐上时光穿梭机,回顾「猪齿鱼」的…

    技术杂谈 2023年7月23日
    088
  • 分析阿里云 ECS 出现内存占用过高原因

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    技术杂谈 2023年5月31日
    099
  • 单元测试

    前言 对于现在的前端工程,一个标准完整的项目,通常情况单元测试是非常必要的。但很多时候我们只是完成了项目而忽略了项目测试。我认为其中一个很大的原因是很多人对单元测试认知不够,因此我…

    技术杂谈 2023年5月31日
    0105
  • jquery常用获取属性的方法有哪些(attr prop区别)

    jquery常用获取属性的方法有:1、attr()方法,可获取并返回指定属性的值,语法”$(selector).attr(“属性名”)&#822…

    技术杂谈 2023年5月31日
    0103
  • 领域驱动设计系列(2)浅析VO、DTO、DO、PO的概念、区别和用处

    转自:http://kb.cnblogs.com/page/522348/ 上一篇文章作为一个引子,说明了领域驱动设计的优势,从本篇文章开始,笔者将会结合自己的实际经验,谈及领域驱…

    技术杂谈 2023年6月1日
    0113
  • crash命令 —— rd

    参考: https://crash-utility.github.io/help_pages/rd.html 用法: 读取内核虚地址地址或者内核符号的值,默认16进制显示,类型为u…

    技术杂谈 2023年5月30日
    0117
  • install virtualenv

    $ [sudo] pip install virtualenv $ mkdir ~/envs $ virtualenv ~/envs/lsbaws/ $ cd ~/envs/lsb…

    技术杂谈 2023年5月30日
    077
  • @Transactional事务几点注意及其属性Propagation的使用

    @Transactional事务几点注意 这里面有几点需要大家留意: A. 一个功能是否要事务,必须纳入设计、编码考虑。不能仅仅完成了基本功能就ok。 B. 如果加了事务,必须做好…

    技术杂谈 2023年6月1日
    0101
  • “情绪智力”管理与提升

    Esther是一个小型团队的管理者,大家都很喜欢她。她亲切友好,彬彬有礼,又善解人意。她是解决问题的能手,习惯将挫折看作是机遇。她对工作十分投入,还能鼓励同事保持平静。有了这样一个…

    技术杂谈 2023年5月31日
    0104
  • Unity Hub 机器标识对于当前许可证无效解决

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    技术杂谈 2023年5月31日
    096
  • Jedis案例

    案例: 案例需求: 提供index.html页面,页面中有一个省份 下拉列表 当页面加载完成后 发送ajax请求,加载所有省份 代码实现: ProvinceDao package …

    技术杂谈 2023年6月21日
    0160
  • jsp注释<%– — %> 和 <!– –> 的区别?

    jsp页面注释代码推荐用 在jsp中,采用注释代码,浏览器还是会解析注释中的代码,而且用户使用浏览器查看页面源码的时候,注释的代码对于他们是可见的,所以不管是为了提高效率,还是为了…

    技术杂谈 2023年5月31日
    0120
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球