应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

搜索引擎原理(搜索引擎是如何工作的?)

  搜索引擎原理(搜索引擎是如何工作的?)
  前言
  我们每天都在用Google,百度这些搜索引擎,那大家有没想过搜索引擎是如何实现的呢,看似简单的搜索其实技术细节非常复杂,说搜索引擎是IT皇冠上的明珠也不为过,今天我们来就来简单过一下搜索引擎的原理,看看它是如何工作的,当然搜索引擎博大精深,一篇文章不可能完全介绍完,我们只会介绍它最重要的几个步骤,不过万变不离其宗,搜索引擎都离不开这些重要步骤,剩下的无非是在其上添砖加瓦,所以掌握这些关键路径,能很好地达到观一斑而窥全貎的目的。
  本文将会从以下几个部分来介绍搜索引擎,会深度剖析搜索引擎的工作原理及其中用到的一些经典数据结构和算法,相信大家看了肯定有收获。
  搜索引擎系统架构图
  搜索引擎工作原理详细剖析
  搜索引擎系统架构图
  搜索引擎整体架构图如下图所示,大致可以分为搜集,预处理,索引,查询这四步,每一步的技术细节都很多,我们将在下文中详细分析每一步的工作原理。
  搜索引擎工作原理详细剖析
  一、搜集
  爬虫一开始是不知道该从哪里开始爬起的,所以我们可以给它一组优质种子网页的链接,比如新浪主页,腾讯主页等,这些主页比较知名,在Alexa排名上也非常靠前,拿到这些优质种子网页后,就对这些网页通过广度优先遍历不断遍历这些网页,爬取网页内容,提取出其中的链接,不断将其将入到待爬取队列,然后爬虫不断地从url的待爬取队列里提取出url进行爬取,重复以上过程。。。
  当然了,只用一个爬虫是不够的,可以启动多个爬虫并行爬取,这样速度会快很多。
  1、待爬取的url实现
  待爬取url我们可以把它放到Redis里,保证了高性能,需要注意的是,Redis要开启持久化功能,这样支持断点续爬,如果Redis挂掉了,重启之后由于有持续久功能,可以从上一个待爬的url开始重新爬。
  2、如何判重
  如何避免网页的重复爬取呢,我们需要对url进行去重操作,去重怎么实现?可能有人说用散列表,将每个待抓取url存在散列表里,每次要加入待爬取url时都通过这个散列表来判断一下是否爬取过了,这样做确实没有问题,但我们需要注意到的是这样需要会出巨大的空间代价,有多大,我们简单算一下,假设有10亿url(不要觉得10亿很大,像Google,百度这样的搜索引擎,它们要爬取的网页量级比10亿大得多),放在散列表里,需要多大存储空间呢?
  我们假设每个网页url平均长度64字节,则10亿个url大约需要60G内存,如果用散列表实现的话,由于散列表为了避免过多的冲突,需要较小的装载因子(假设哈希表要装载10个元素,实际可能要分配20个元素的空间,以避免哈希冲突),同时不管是用链式存储还是用红黑树来处理冲突,都要存储指针,各种这些加起来所需内存可能会超过100G,再加上冲突时需要在链表中比较字符串,性能上也是一个损耗,当然100G对大型搜索引擎来说不是什么大问题,但其实还有一种方案可以实现远小于100G的内存:布隆过滤器。
  针对10亿个url,我们分配100亿个bit,大约1。2G,相比100G内存,提升了近百倍!可见技术方案的合理选择能很好地达到降本增效的效果。
  当然有人可能会提出疑问,布隆过滤器可能会存在误判的情况,即某个值经过布隆过滤器判断不存在,那这个值肯定不存在,但如果经布隆过滤器判断存在,那这个值不一定存在,针对这种情况我们可以通过调整布隆过滤器的哈希函数或其底层的位图大小来尽可能地降低误判的概率,但如果误判还是发生了呢,此时针对这种url就不爬好了,毕竟互联网上这么多网页,少爬几个也无妨。
  3、网页的存储文件:docraw。bin
  爬完网页,网页该如何存储呢,有人说一个网页存一个文件不就行了,如果是这样,10亿个网页就要存10亿个文件,一般的文件系统是不支持的,所以一般是把网页内容存储在一个文件(假设为docraw。bin)中,如下
  当然一般的文件系统对单个文件的大小也是有限制的,比如1G,那在文件超过1G后再新建一个好了。
  图中网页id是怎么生成的,显然一个url对应一个网页id,所以我们可以增加一个发号器,每爬取完一个网页,发号器给它分配一个id,将网页id与url存储在一个文件里,假设命名为docid。bin,如下
  二、预处理
  爬取完一个网页后我们需要对其进行预处理,我们拿到的是网页的html代码,需要把lt;scriptgt;,lt;stylegt;,lt;optiongt;这些无用的标签及标签包含的内容给去掉,怎么查找是个学问,可能有人会说用BF,KMP等算法,这些算法确实可以,不过这些算法属于单模式串匹配算法,查询单个字段串效率确实不错,但我们想要一次性查出lt;scriptgt;,lt;stylegt;,lt;optiongt;这些字段串,有啥好的方法不,答案是用AC自动机多模式串匹配算法,可以高效一次性找出几个待查找的字段串,有多高效,时间复杂度接近0(n)!关于AC自动机多模式匹配算法的原理不展开介绍,大家可以去网上搜搜看,这里只是给大家介绍一下思路。
  找到这些标签的起始位置后,剩下的就简单了,接下来对每个这些标签都查找其截止标签lt;scriptgt;,lt;stylegt;,lt;optiongt;,找到之后,把起始终止标签及其中的内容全部去掉即可。
  做完以上步骤后,我们也要把其它的html标签去掉(标签里的内容保留),因为我们最终要处理的是纯内容(内容里面包含用户要搜索的关键词)
  三、分词并创建倒排索引
  拿到上述步骤处理过的内容后,我们需要将这些内容进行分词,啥叫分词呢,就是将一段文本切分成一个个的词。比如Iamachinese分词后,就有I,am,a,chinese这四个词,从中也可以看到,英文分词相对比较简单,每个单词基本是用空格隔开的,只要以空格为分隔符切割字符串基本可达到分词效果,但是中文不一样,词与词之类没有空格等字符串分割,比较难以分割。以我来到北京清华大学为例,不同的模式产生的分词结果不一样,以github上有名的jieba分词开源库为例,它有如下几种分词模式【全模式】:我来到北京清华清华大学华大大学【精确模式】:我来到北京清华大学【新词识别】:他,来到,了,网易,杭研,大厦【搜索引擎模式】:小明,硕士,毕业,于,中国,科学,学院,科学院,中国科学院,计算,计算所,后,在,日本,京都,大学,日本京都大学,深造
  分词一般是根据现成的词库来进行匹配,比如词库中有中国这个词,用处理过的网页文本进行匹配即可。当然在分词之前我们要把一些无意义的停止词如的,地,得先给去掉。
  经过分词之后我们得到了每个分词与其文本的关系,如下
  细心的你一定发现了,不同的网页内容有可能出现同样的分词,所以我们把具有相同分词的网页归在一起,如下所示
  这样我们在搜大学的时候找到大学对应的行,就能找到所有包含有大学的文档id了。
  看到以上分词倒排索引的处理流程,大家想到了什么?没错,这不就是ElasticSearch搜索引擎干的事吗,也是ES能达到毫秒级响应的关键!
  这里还有一个问题,根据某个词语获取得了一组网页的id之后,在结果展示上,哪些网页应该排在最前面呢,为啥我们在Google上搜索一般在第一页的前几条就能找到我们想要的答案。这就涉及到搜索引擎涉及到的另一个重要的算法:PageRank,它是Google对网页排名进行排名的一种算法,它以网页之间的超链接个数和质量作为主要因素粗略地分析网页重要性以便对其进行打分。我们一般在搜问题的时候,前面一两个基本上都是stackoverflow网页,说明Google认为这个网页的权重很高,因为这个网页被全世界几乎所有的程序员使用着,也就是说有无数个网页指向此网站的链接,根据PageRank算法,自然此网站权重就啦,恩,可以简单地这么认为,实际上PageRank的计算需要用到大量的数学知识,毕竟此算法是Google的立身之本,大家如果有兴趣,可以去网上多多了解一下。
  完成以上步骤,搜索引擎对网页的处理就完了,那么用户输入关键词搜索引擎又是怎么给我们展示出结果的呢。
  四、查询
  用户输入关键词后,首先肯定是要经过分词器的处理。比如我输入中国人民,假设分词器分将其分为中国,人民两个词,接下来就用这个两词去倒排索引里查相应的文档
  得到网页id后,我们分别去docid。bin,docraw。bin里提取出网页的链接和内容,按权重从大到小排列即可。
  这里的权重除了和上文说的PageRank算法有关外,还与另外一个TFIDF(
  https:zh。wikipedia。orgwikiTfidf)算法有关,大家可以去了解一下。
  另外相信大家在搜索框输入搜索词的时候,都会注意到底下会出现一串搜索提示词,
  如图示:输入chin这四个字母后,底下会出现一列提示词。
  如何实现的,这就不得不提到一种树形结构:Trie树。Trie树又叫字典树、前缀树(PrefixTree)、单词查找树,是一种多叉树结构,如下图所示:
  这颗多叉树表示了关键字集合〔to,tea,ted,ten,a,i,in,inn〕。从中可以看出Trie树具有以下性质:
  根节点不包含字符,除根节点外的每一个子节点都包含一个字符
  从根节点到某一个节点,路径上经过的字符连接起来,为该节点对应的字符串
  每个节点的所有子节点包含的字符互不相同
  通常在实现的时候,会在节点结构中设置一个标志,用来标记该结点处是否构成一个单词(关键字)。
  另外我们不难发现一个规律,具有公共前缀的关键字(单词),它们前缀部分在Trie树中是相同的,这也是Trie树被称为前缀树的原因,有了这个思路,我们不难设计出上文所述搜索时展示一串搜索提示词的思路:
  一般搜索引擎会维护一个词库,假设这个词库由所有搜索次数大于某个阈值(如1000)的字符串组成,我们就可以用这个词库构建一颗Trie树,这样当用户输入字母的时候,就可以以这个字母作为前缀去Trie树中查找,以上文中提到的Trie树为例,则我们输入te时,由于以te为前缀的单词有〔tea,ted,ted,ten〕,则在搜索引擎的搜索提示框中就可以展示这几个字符串以供用户选择。
  五、寻找热门搜索字符串
  Trie树除了作为前缀树来实现搜索提示词的功能外,还可以用来辅助寻找热门搜索字符串,只要对Trie树稍加改造即可。假设我们要寻找最热门的10个搜索字符串,则具体实现思路如下:
  一般搜索引擎都会有专门的日志来记录用户的搜索词,我们用用户的这些搜索词来构建一颗Trie树,但要稍微对Trie树进行一下改造,上文提到,Trie树实现的时候,可以在节点中设置一个标志,用来标记该结点处是否构成一个单词,也可以把这个标志改成以节点为终止字符的搜索字符串个数,每个搜索字符串在Trie树遍历,在遍历的最后一个结点上把字符串个数加1,即可统计出每个字符串被搜索了多少次(根节点到结点经过的路径即为搜索字符串),然后我们再维护一个有10个节点的小顶堆(堆顶元素比所有其他元素值都小,如下图示)
  如图示:小顶堆中堆顶元素比其他任何元素都小
  依次遍历Trie树的节点,将节点(字符串次数)传给小顶堆,根据搜索次数不断调整小顶堆,这样遍历完Trie树的节点后,小顶堆里的10个节点即是最热门的搜索字符串。
  总结
  本文简述了搜索引擎的工作原理,相信大家看完后对其工作原理应该有了比较清醒的认识,我们可以看到,搜索引擎中用到了很多经典的数据结构和算法,所以现在大家应该能明白为啥Google,百度这些公司对候选人的算法要求这么高了。

温州到厦门要多久(乐清到厦门开车要多久)澎湃新闻记者姚似璐通讯员翁文佩住家保姆凌晨在雇主家坠楼身亡,死者家属以其是在工作中发生事故为由,将雇主刘某夫妇诉至法院要求赔偿死亡赔偿金丧葬费交通费等共计130万余元。澎湃新闻(w增城新塘(广州碧桂园凤凰城)增城新塘(广州碧桂园凤凰城)总会有些客户想找些新楼盘的准现楼,这样的客户抱着几个心理,第一签约完用不了太长时间就可以收楼入住或者出租,不用白白交几年的月供给银行,第二看房时可以更直从化汽车站到白水寨(广州增城白水寨一日游攻略)从化汽车站到白水寨(广州增城白水寨一日游攻略)如果你去过白水寨,你在上山的过程中可以看见很多水管,其中靠近仙姑天池的地方,水管的直接估计将近2米。你会不会和我有相同的疑问,瀑布是靠天河到从化要多久(天河到从化地铁要多久)年底广州地铁14号线就要开通啦从化区街坊喜提地铁终于能坐上地铁去从化欣赏美丽的自然景色吃香喝辣到处去浪14号线一期的13个车站站名从南到北分别为嘉禾望岗白云东平夏良太和竹料钟落潭马宜兴高铁站(宜兴高铁站时刻表)宜兴高铁站(宜兴高铁站时刻表)目前宜兴没有前往无锡市区以及苏州的直线高铁,虽然即将建设的盐泰锡常宜高铁可以让宜兴融入苏南的高铁网络,但是路线依然比较绕。宜兴前往苏州乃至上海最近的通名古屋到大阪多久(名古屋开车到大阪多久)前言这次去日本属于鬼使神差,刹那的决定。然后就是按部就班的办签证,做攻略。不断地在淘宝携程同程等各大网站比对机票,结果同程的一位客服打电话来问我最近是否需要订购机票(我怀疑后台有搜如何祛斑美白(怎么样美白淡斑最有效)呵护肌肤是很多女孩子们都非常在意的一件事,其中大家最看重的可能还要当属美白。毕竟没有哪个女孩想要每天顶着黝黑的面庞出门,大家都希望能有白净无暇的好皮肤来给自己的颜值增光添彩。如果,简单美白(皮肤美白最快的方法)简单美白(皮肤美白最快的方法)时间过的真快,转眼2019就过了一半,热skr的夏天也快过去了,洛洛代表洛神媛粉丝团,很高兴的通知广大学生党。夏天过去,难过的除了学生,还有一批晒黑党男生快速美白方法(分享男人脸部美白的方法)男生快速美白方法(分享男人脸部美白的方法)男士快速美白方法1防晒很重要不管是男士美白还是女士美白,防晒工作要做好,每天出门前涂抹防晒霜,不要暴晒在太阳之下,让紫外线直接照射哦。早上如何美白脸部(科学美白的方法有哪些?)如何美白脸部(科学美白的方法有哪些?)亚洲人对美白有一种近乎疯狂的热恋,因为皮肤白嫩显得我们更加的年轻,再者我们亚洲人的五官轮廓浅色肤色黑色眼球的视觉对比下,白色让我们显得更加精神祛斑产品10强排行榜!(淡斑产品排行榜10强)祛斑产品10强排行榜!(淡斑产品排行榜10强)皮肤会随着年龄的增长出现问题,最常见的就是色斑和皱纹,要想维持紧致细腻的状态,护肤品的选择肯定是非常重要的,那么祛斑去皱美白的化妆品什
蝎子吃哪里(蝎子几条腿)生活习性蝎子喜欢群居,野生蝎子常在固定的窝穴内结伴定居,每窝的数量视窝穴的大小而定,少则20只,多至500只或者更多。每窝内有雌有雄,有大有小,和睦相处,很少发生互相残杀的现象。但哪里有卖炭(一般哪里可以买到碳)东南网12月2日讯(本网记者张立庆)12月2日,全国首个省级碳市场综合服务平台在福建正式上线运行,这标志着福建省在助力企业绿色低碳转型,推动碳达峰碳中和方面又迈出坚实一步。活动现场炭哪里有卖(木炭机全套多少钱一台)无烟炭化炉目前的市场价因规格型号的而不同而不同,卧式无烟炭化炉的市场价大致范围在35万,连续式炭化机的市场价范围在1530万,具体配置型号的不同价格差异还是很大的,具体的设备价格行木炭哪里卖(附近哪里有卖炭急用)随着社会的飞速发展,特别是夏天的到来,烧烤已经成为了人们餐桌上必不可少的一道美食。而木炭作为烧烤的原料也慢慢地出现在人们的视野当中。据不完全统计,一个普通的烧烤店一天平均可以用掉大吉利技术品牌(吉利技术输出雷诺,国货已强真的来了?)吉利技术品牌(吉利技术输出雷诺,国货已强真的来了?)如果放在十年前,你说自主品牌不太行,想必没有太多人会质疑这种说法,因为事实的确如此。可随着智联网与信息通信技术的不断创新与发展,包子和馒头的来历(馒头和包子有何渊源?)包子和馒头的来历(馒头和包子有何渊源?)为什么北方人叫馒头就是馒头,而南方人却把包子也叫做馒头呢?作为北方人,从小就是啃着馒头长大的,所以对馒头那是知根知底,但是有一个问题不知道大哪里可以学汉堡技术(在哪学做汉堡)汉堡品类市场是很多人都非常看好的创业项目,而想要在竞争激烈的汉堡市场上站稳脚跟,想要在汉堡品类上赚到钱,想要成为市场上人气爆棚的汉堡店,就一定要充分满足消费者的需求产品要差异化够新今日四版币最新价格(狗狗币价格)誓约胜利之剑,其中1元有纸币硬币2种。元元四版50元,43美元一枚。以市价为准,狗狗币最新价格是多少截止目前。055人赞同了该文章。今年第五套人民币值多少钱第五版人民币共有1元5元馒头怎么做才松软好吃(老式蒸馒头的发面方法)手把手教你在家蒸老面馒头,又白又松软好吃,一次蒸一大锅不够吃。作为一个北方人来说,从小就是吃着面食长大的,在所有的面食中,馒头可以说是扮演了非常重要的角色,但是现在的馒头好多都是在小鸡宝宝考考你,以下哪种动物拥有和人类相似的指纹8月23小鸡宝宝考考你,以下哪种动物拥有和人类相似的指纹8月23日蚂蚁庄园每日一题的答案是什么?选对答案的话就可以领取180g小鸡饲料了,小伙伴们一起来看看今天的正确答案吧!支付宝蚂蚁庄园哪种动物拥有和人类相似的指纹今天蚂蚁庄园哪种动物拥有和人类相似的指纹?考拉的手上都长有指纹,而且和人类的指纹非常的相似,以上就是今天蚂蚁庄园答题的内容了,小伙伴们一起来看看正确答案吧!支付宝蚂蚁庄园8月23日问题小鸡宝宝
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网