2024年Web前端最全搜索引擎工作原理,2024年最新我的阿里手淘面试经历分享

最后

为了帮助大家更好的了解前端,特别整理了《前端工程师面试手册》电子稿文件。

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

或者广度优先,从中间或者是边缘随便哪里开始都行,把表面一层挖完了西瓜再进行下一个深度的挖取。

蜘蛛的爬行策略

蜘蛛的爬行策略和挖西瓜一样,都是两种方式

  • 深度优先

  • 广度优先

深度优先如下图

蜘蛛先从A页面开始爬行,发现该页面总共有3个超链接,A1、B1、XX,蜘蛛选择先从A1页面爬行下去,它在A1页面发现了一个唯一的超链接A2,便沿着A2向下,以此类推,等爬到最底下,也就是A4页面,A4整个页面上没有任何超链接,再也无法往下爬行了,它便返回到B1开始爬行,这就是深度优先。

广度优先如下

这次这是一个利用广度优先策略的蜘蛛,它先从A页面出发,现在A页面有3个链接,A1、B1、C1,它会先把A1、B1、C1先爬一遍,也就是第一层发现的超链接全部爬行完,然后再进入第二层,也就是A1页面。把A1页面中所有的超链接全部爬行一遍,保证广度上全部链接是都完成爬行了的。

无论是深度优先还是广度优先,蜘蛛都可以通过这两个策略完成对整个互联网页面的爬行。

当然,由于蜘蛛的带宽资源和时间有限的问题,蜘蛛不会选择爬完所有页面,它实际收集到的页面知识互联网的一小部分,在条件限制的情况下,蜘蛛通常会深度优先和广度优先混合使用,广度优先保证了尽可能照顾到多的网站,而广度优先保证了尽可能照顾到一部分网站中的内页。

吸引蜘蛛抓取页面

可以看出,在实际情况中,蜘蛛不会爬行、抓取互联网上所有的页面,既然如此,蜘蛛所要做的就是尽量抓取重要页面,而SEO人员要做的,就是吸引蜘蛛的注意,让蜘蛛更多的抓取自己家网站的页面。

对于蜘蛛来说,页面拥有哪些特征会被看作是重要页面呢,主要有以下这几方面因素:

1.网站和页面权重

质量高,资格老的网站被认为权重较高,这种网站上页面的爬行深度也会比较高,所以这种网站网页被收录的机会会更多。

2.页面更新度

如A网页的数据之前在蜘蛛爬行后已经被保存在数据库中了,当蜘蛛第二次爬行A网页时,会将A网页此时的数据和数据库中的数据进行对比,如果蜘蛛发现A网页的内容更新了,就会认为这个网页更新频率多,蜘蛛抓取这个页面的频率也会更加频繁,如果页面和上次储存的数据完全一样,就说明页面是没更新,蜘蛛就会减少自己爬行该页面的频率。

3.高质量的外链

张三是班上公认的人品好为人公正的学霸,李四是班上惹人讨厌最爱撒谎的学生,张三给大家说王五这个人真的很聪明为人也很善良,其他同学都会认为王五肯定是这样,李四给其他同学说王五这个人很好,其他同学基本不会相信李四的鬼话。

同样一句话,从不同人的嘴里说出来,造成的结果、影响都不一样。

链接的引用也是这样,比如在一个蜘蛛认为的高质量页面中,页面在最后引用了一个链接,指向你的页面,那么这个高质量页面的引用,在蜘蛛判断你的网页是否是高质量网页时,也会产生一定的影响,被高质量网页引用的多了(超级多的大佬夸你人好),那么蜘蛛在判断你页面时产生的影响也就更大(同学也觉得你就是人好)。

4.与首页的距离

一般来说自己网站被其他网站引用最多的页面就是首页,所以它的权重相比来说是最高的,比如A页面是A网站的首页,可以得出的结论是,离A网页更进的页面,页面权重也容易更高,比如A页面上的超链接更容易被蜘蛛爬行,更容易获得蜘蛛的抓取,那些没被蜘蛛发现的网页,权重自然就是0。

还有一点比较重要的是,蜘蛛在爬行页面时会进行一定程度的复制检测,也就是当前被爬行的页面的内容,是否和已经保存的数据有重合(当页面内容为转载/不当抄袭行为时就会被蜘蛛检测出来),如果一个权重很低的网站上有大量转载/抄袭行为,蜘蛛很可能不会再继续爬行。

之所以要这么做也是为了用户的体验,如果没有这些去重步骤,当用户想要搜索一些内容时,发现返回的结果全都是一模一样的内容,会大大影响用户的体验,最后导致的结果就是这个搜索引擎绝对不会有人再用了,所以为了用户使用的便利,也是为了自己公司的正常发展。

地址库

互联网上的网页这么多,为了避免重复爬行和抓取网页,搜索引擎会建立地址库,一个是用来记录已经被发现但还没有抓取的页面,一个是已经被抓取过的页面。

待访问地址库(已经发现但没有抓取)中的地址来源于下面几种方式:

1.人工录入的地址

2.蜘蛛抓取页面后,从HTML代码中获取新的链接地址,和这两个地址库中的数据进行对比,如果没有,就把地址存入待访问地址库。

3.站长(网站负责人)提交上去的想让搜索引擎抓取的页面。(一般这种效果不大)

蜘蛛按照重要性从待访问地址库中提取URL,访问并抓取页面,然后把这个URL地址从待访问地址库中删除,放进已访问地址库中。

文件存储

蜘蛛会将抓取的数据存入原始页面数据库。

存入的数据和服务器返回给蜘蛛的HTML内容是一样的,每个页面存在数据库里时都有自己的一个独一无二的文件编号。

预处理

我们去商场买菜时,会看到蔬菜保险柜里的这些蔬菜被摆放的整整齐齐,这里举的例子是那些用保鲜膜包好有经过包装的蔬菜。

最后呈现在顾客面前的就是上面这张图那样,包装完好,按照不同的分类摆放有序,顾客一眼就能很清楚的看到每个区域分别是什么蔬菜。

在最终完成这个结果之前,整个流程大概也是三个步骤:

1.选出可以售卖的蔬菜

从一堆蔬菜中,选出可以拿去售卖的蔬菜。

2.预处理

此时你面前摆放的就是全部可以拿去售卖的蔬菜了,但是如果,今天就要把这些蔬菜放到蔬菜保险柜中的话,你今天才开始对这些蔬菜进行整理会浪费大量的时间(给蔬菜进行包装等),说不定顾客来了蔬菜还没整理好。

所以你的解决方法是,提前将这些可以拿去售卖的蔬菜提前包装好,存放在仓库里,等保险柜中的蔬菜缺少了需要补货时,花个几分钟时间跑去仓库把蔬菜拿出来再摆放再货架上就行了。(我猜的,具体商场里的流程是怎么样的我也不知道,为了方便后续的理解用生活上的例子进行说明效果会更好)

3.摆放上保险柜

也就是上面最后一段内容那样,当需要补货时,从仓库里拿出包装好的蔬菜,按照蔬菜的类别摆放到合适的位置就可以了,这个就是最后的排序步骤。

回到搜索引擎的工作流程中,这个预处理的步骤就和上面商场预处理步骤的作用一样。

当蜘蛛完成数据收集后,就会进入到这个步骤。

蜘蛛所完成的工作,就是在收集了数据后将数据(HTML)存入原始页面数据库。

而这些数据,不是用户在搜索后,直接用来进行排序并展示在搜索结果页的数据。

原始页面数据库中的页面数量都是在数万亿级别以上,如果在用户搜索后对原始页面数据库中的数据进行实时排序,让排名程序(每个步骤所使用的程序不一样,收集数据的程序叫蜘蛛,排名时所用的程序是排名程序)分析每个页面数据与用户想搜索的内容的相关性,计算量太大,会浪费太多时间,不可能在一两秒内返回排名结果。

因此,我们需要先将原始页面数据库中的数据进行预处理,为最后的排名做好准备。

提取文字

我们存入原始页面数据库中的,是HTML代码,而HTML代码中,不仅有用户在页面上直接可以看到的文字内容,还有其他例如js,AJAX等这类搜索引擎无法用于排名的内容。

首先要做的,就是从HTML文件中去除这些无法解析的内容,提取出可以进行排名处理步骤的文字内容

比如下面这段代码

软件工程师需要了解的搜索引擎知识
hi

<img alt=“Google” src=“/images/test.png”

可以看出整个HTML中,真正属于文字内容的信息只有两句

这是一个描述内容

软件工程师需要了解的搜索引擎知识

hi

Google

搜索引擎最终提取出来的信息就是这四句,用于排名的文字也是这四句。

可以提取出来的文字内容大概就是,Meta标签中的文字、img标签alt属性中的文字、Flash文件的替代文字、链接锚文字等。

中文分词

分词是中文搜索引擎特有的步骤,搜索引擎存储/处理页面/用户搜索时都是以词为基础的。

I’m fine, and you?

中文和英文等语言单词不同,在使用英文时各个单词会有空格分隔,搜索引擎可以直接把每一个句子划分为多个英文单词的集合。而对中文来说,词汇和词汇之间是没有任何分隔符可以对各词汇进行分隔的。

比如这句话里的词就是连接在一起的

对于这种情况,搜索引擎首先需要分辨哪几个字组成一个词,如 我喜欢吃【水果】,或者哪些字本身就是一个词,如 这里有【水】,

再如下面这句话

你好,这是一篇关于搜索引擎的文章

搜索引擎会将这一段文字拆解成一个个词汇,大概如下

你好

这是

一篇

关于

搜索引擎

文章

搜索引擎将这段文字拆解成了7个词汇(我瞎猜的,具体多少个我也不知道,每个搜索引擎分词的方法都不一样)

中文分词的方法基本上有两种:

  • 基于词典匹配

  • 基于统计

1.基于词典匹配

将需要分析的一段汉字与一个时间创建好的词典中的词条进行匹配,如果在这段汉字中扫描到词典中已有的词条则匹配成功。

这种匹配方式最简单,但匹配的正确程序取决于这个词典的完整性和更新情况。

2.基于统计

一般是通过机器学习完成,通过对海量网页上的文字样本进行分析,计算出字与字相邻出现的统计概率,几个字相邻出现越多,就越可能形成一个词。

这种优势是对新出现的词反应更快速。

实际使用中的分词系统都是两种方法同时混合使用。

去停止词

不管是英文还是中文,页面中都会有一些出现频率很高的&对内容没有任何影响的词,如中文的【的】、【啊】、【哈】之类,这些词被称为停止词。

英文中常见的停止词有[the]/[a]/[an]等。

搜索引擎会去掉这些停止词,使数据主题更突出,减少无谓的计算量。

去掉噪声词

大部分页面里有这么一部分内容对页面主题没什么贡献,比如A页面的内容是一篇关于SEO优化的文章,关键词是SEO,但是除了讲解SEO这个内容的主体内容外,共同组成这个页面的还有例如页眉,页脚,广告等区域

在这些部分出现的词语可能和页面内容本身的关键词并不相关。

比如导航栏中如何出现【历史】这个词,导航栏上想要表达的实际是历史记录之类的意思,搜索引擎可能会把他误以为是XX国家历史,XX时代历史之类这种层面的【历史】,搜索引擎所理解的和页面本身内容想表达的完全不相关,所以这些区域都属于噪声,在搜索引擎分析一个页面的时候,它们只会对页面主题起到分散作用。

搜索引擎的排名程序在对数据进行排名时不能参考这些噪声内容,我们在预处理阶段就需要把这些噪声时别出来并消除他们。

消除噪声的方法是根据HTML的标签对页面进行分块,如页眉是header标签,页脚是footer标签等等,去除掉这些区域后,剩下的才是页面主体内容。

去重

也就是去掉重复的网页,同一篇文章经常会重复在不同网站/同一个网站的不同网址上。为了用户的体验,去重步骤是必须的,搜索引擎会对页面进行识别&删除重复内容,这个过程称为蛆虫和。

去重的方法是先从页面主体内容中选取最有代表性的一部分关键词(经常是出现频率最高的关键词,由于之前已经有了去停止词的步骤,因此在这时出现频率最高的关键词可能就真的是整个页面的关键词了),然后计算这些关键词的数字指纹。

通常我们在页面中选取10个关键词就可以达到比较高的计算准确性了。

典型的指纹计算方法如MD5算法(信息摘要算法第五版)。这类指纹算法的特点是,输入(也就是上面提取出来的关键词)只要有任何微小的变化,都会导致计算出的指纹有很大差距。

比如我们用两个数相乘,第一组和第二组的不同仅仅是第一个数字 0.001 的差别,最终生成的结果却千差万别。

了解了搜索引擎的去重算法后,就会发现那些在文章发布者眼里的原创内容实际对搜索引擎来说就是非原创,比如简单的增加/删除【的】【地】等这些去停止词、调换段落顺序、混合不同文章等操作,在搜索引擎进行去重算法后,都会被判断为非原创内容,因为这些操作并不会改变文章的关键词。

(比如我写的这篇笔记里的一些段落就是‘借鉴’了一下,我是从书里看的不是在网页上直接浏览的,如果搜索引擎在对我这篇文章进行文字提取、分词、消噪、去重后,发现剩下的关键词和已收录的某个网页数据的内容都匹配上了,就会认为我是伪原创甚至非原创,最终影响的就是我这篇文章在搜索引擎工作原理这个关键词上的排名)

正向索引

正向索引可以简称为索引。

经过上述各步骤(提取、分词、消噪、去重)后,搜索引擎最终得到的就是独特的、能反映页面主体内容的、以词为单位的内容。

接下来由搜索引擎的索引程序提取关键词,按照分词程序划分好的词,把页面转换为一个由关键词组成的集合,同时还需要记录每一个关键词在页面上的出现频率、出现次数、格式(如是出现在标题标签、黑体、h标签、还是锚文字等)、位置(如页面第一段文字等)。

搜索引擎的索引程序会将页面和关键词形成的词表结构存储进索引库。

简化的索引词表形式如图

每个文件都对应一个文件ID,文件内容被表示成一串关键词的集合。

实际上在搜索引擎索引库中,关键词也已经转换为关键词ID,这样的数据结构被称为正向索引。

倒排索引

正向索引不能直接用于排名,假设用户搜索关键词【2】,如果只存在正向索引,排名程序需要扫描所有索引库中的文件,找出包含关键词【2】的文件,再进行相关性计算。

这样的计算量无法满足实时返回排名结果的要求。

我们可以提前对所有关键词进行分类,搜索引擎会将正向索引数据库重新构造为倒排索引,把文件对应到关键词的映射转换为关键词到文件的映射,如下图

在倒排索引中关键词是主键,每个关键词都对应着一系列文件,比如上图第一排右侧显示出来的文件,都是包含了关键词1的文件。

这样当用户搜索某个关键词时,排序程序在倒排索引中定位到这个关键词,就可以马上找出所有包含这个关键词的文件。

给搜索结果进行排名

经过前面的蜘蛛抓取页面,对数据预处理&索引程序计算得到倒排索引后,搜索引擎就准备好可以随时处理用户搜索了。

用户在搜索框输入想要查询的内容后,排名程序调用索引库的数据,计算排名后将内容展示在搜索结果页中。

搜索词处理

搜索引擎接收到用户输入的搜索词后,需要对搜索词做一些处理,然后才进入排名过程。

打开全栈工匠技能包-1小时轻松掌握SSR

两小时精通jq+bs插件开发

生产环境下如歌部署Node.js

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

网易内部VUE自定义插件库NPM集成

谁说前端不用懂安全,XSS跨站脚本的危害

webpack的loader到底是什么样的?两小时带你写一个自己loader

  • 13
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值