这就是搜索引擎

这个系列的文章是一只试图通过产品角度出发去理解复杂庞大搜索引擎的汪写出来的,不足之处很多,欢迎广大技术、非技术同学阅读后指正错误,我们一起探讨共同进步。

本篇主要介绍搜索引擎的架构、网络爬虫、及索引建立。

一、搜索引擎基本信息

1.1 什么是搜索引擎
通俗来讲就是从互联网海量信息中捞出用户感兴趣的内容提供给用户。

1.2 发展历程
分类目录的:纯人工收集整理,代表是导航,如yahoo和hao123 

—> 文本检索:采用信息检索模型查询关键词与网页文本的相关程度

—> 链接分析:利用网页间的链接关系分析网页重要性,代表技术google的pageRank 

—>用户中心:理解用户需求为核心,典型千人千面。

1.3搜索引擎基本架构

该架构主要有三方面的作用:
1、通过爬虫获得互联网上的海量网页信息,存储在本地并建立索引方便查找;
2、用户输入查询query,解析查询意图,并将query分发进行查询;
3、使用query通过各种算法对索引中的文档(网页)排序,返回最符合意图的若干条结果。
本篇主要从第一方面作用来介绍搜索引擎。

二、网络爬虫

2.1通用爬虫框架

爬取流程:

选取部分网页作为种子url,放入待抓取url队列

—>读取待抓取url通过DNS解析,下载网页

—>将下载的url存储到本地页面库并建立索引,url放入已抓取url队列

—>解析已下载url,抽取所有链接,与已抽取url队列去重后放入待抓取url

—>继续下载待抓取url队列

—>形成循环,直至待抓取url队列为空。

2.2  爬虫类型
批量型爬虫(batch crawler):有明确抓取范围和目标,达到目标即停止。

增量型爬虫(incremental crawler):持续不断抓取,对抓到的网页定期更新。

垂直型爬虫(focused crawler):抓取阶段识别网页是否与主题相关,判断是否抓取。

2.3 爬虫抓取策略
目的:优先选择重要网页进行抓取。

宽度优先遍历策略(breathfirst):将新下载网页包含的链接直接追加到待抓取URl队列末尾。该策略隐含了一些网页优先级假设。

非完全pagerank策略(partial pagerank):已下载和待抓取url一起形成网页集合,在集合内进行pagerank计算,将待抓取url按照pagerank排序。为提升效率,当新下载网页数超过K 个重新计算一遍pagerank,对于新抽取出的且没有pagerank值的网页,将该网页所有入链传到pagerank值汇总,作为临时pagerank值进行比较。

OCIP策略(online pageimportance computation):每个页面给予相同现金(cash),下载某个页面P后,页面p的cash均分到包含的每个链接上,最终根据链接cash大小排序下载。

大站优先策略(larger sites first):优先下载等待下载页面最多的网站。

2.4 网页更新策略
目的:决定何时更新已下载的网页,使得本地数据与互联网原始页面内容一致。

历史参考策略:过去频繁更新的网页未来也会频繁更新。

用户体验策略:保存网页的多个版本,根据每次内容变化对搜索质量影响得到平均值,作为判断抓取更新的依据。

聚类抽样策略:网页聚类。具有相同属性的网页更新时间相同

2.5  暗网抓取方法
对于存储于数据库的无法获得的网页信息,采用富含信息查询模板方式来抓取。

判断是否是富含信息查询模板的方法是ISIT算法。基本思想是从一维模板开始逐个考察,若是富含信息查询模板,则扩展到二维模板,如此类推逐步增加维数,直至无法再找到富含信息查询模板。

爬虫的目的就是尽量获得最新、最全的网页信息存储到本地。

三、建立索引
爬虫将文档(即网页)信息下载到本地后,需要对文档建立倒排索引。倒排索引就是抽取文档中的单词,建立单词与文档的对应关系,这样就能通过关键词的匹配查找到相应的文档。

3.1名词解释
TF:单词频率

DF:文档频率

单词词典:维护文档集合中出现的所有单词相关信息,同时记录单词对应的倒排列表在倒排文件中的位置信息。

文档编号(document id):文档集合内每个文档赋予一个唯一的内部编号,在存储时为压缩数据使用文档编号差值(D-gap)来存储。 
倒排列表(postinglist):记载出现过某个单词的所有文档的文档列表及单词在文档中出现的位置。每条记录称为一个倒排项(posting)。

倒排文件(inverted file):所有单词的倒排列表顺序地存在磁盘的某个文件里。

倒排索引(inverted index):实现单词-文档矩阵的一种具体存储形式。通过倒排索引,可以获得包含这个单词的文档列表。由两部分组成:单词词典、倒排文件。

3.2  索引建立

3.2.1 单词词典的建立
常用的数据结构是哈希表和树形词典结果

哈希加链表:主体为哈希表,每个表项保存指针,指向相同哈希值单词形成的冲突链表。

树形词典结构:词典项需要按照大小排序,属于层级查找结构。(说实话没弄明白)

3.2.2 索引建立
两遍文档遍历法(2-pass in-memory inversion 全内存索引创建):第一遍扫描统计信息(包括文档个数、单词个数、单词出现信息DF等)并分配内存等资源,做准备工作。第二遍扫描,填充第一遍扫描所分配的内存空间。

本方法需要内存足够大,且两遍扫描速度较慢。

排序法(sort-based inversion):分配固定大小空间用来存放词典信息和索引中间结果,空间被耗光时,中间结果写入磁盘清空内存,用作下一轮存放索引中间结果的存储区。

  归并法(merge-based inversion):整体流程与排序法类似,但排序法在内存中放的是词典信息和三元组数据,二者间并没有直接联系,归并法是在内存中建立起目前处理文档子集的整套倒排索引;中间结果写入磁盘时,排序法将三元组数据排序后写入磁盘临时文件,词典一直保留在内存中,归并法将单词和对应倒排列表写入磁盘,随后彻底清空所占内存。

3.2.3 索引的更新
网页在不断变化,为保证索引能实时动态更新,还需要添加上临时索引、已删除文档列表。


临时索引:内存中实时建立的倒排索引。

已删除文档列表:存储已删除文档的id,形成文档ID列表。

文档被更改时,原先文档放入删除队列,解析更改后的文档内容放入临时索引中,通过该方式满足实时性。用户输入query查询时从倒排索引和临时索引中获得结果,然后利用删除文档列表过滤形成最终搜索结果。

临时索引的更新策略:


1、完全重建:新增文档超过一定数量,对新老文档合并后重新建立索引。

2、再合并策略:新增文档超过一定数量,临时索引合并到老索引中。

3、原地更新策略:增量索引的倒排列表追加到老索引相应位置的末尾。

4、混合策略:将单词根据不同性质分类,不同类别单词采取不同的索引更新策略。

3.2.4 索引的查询
常用的两种查询策略

一次一文档:以倒排列表中包含的文档为单位,将文档与查询的最终相似性得分计算完毕再计算另外一个文档的得分。

一次一单词:以单词为单位,计算文档对于搜索单词的得分,最后将所有单词得分相加。

3.3索引压缩
用户查询时需要将倒排列表信息从磁盘读取到内存中,搜索引擎的索引量都非常巨大,所以需要对索引进行压缩。索引主要包含两个部分:单词词典和对应的倒排列表,压缩也主要针对这两部分进行。
压缩算法指标(按重要性由高到低排列):解压速度、压缩率、压缩速度。

3.3.1 词典压缩

上图词典中DF和倒排列表指针都能用4个字节表示,但单词信息由于词长不同可能会造成存储空间浪费。

如上图的优化结构中,将连续词典分块,每个单词增加长度信息,多个单词共用指针信息。这样文档频率、倒排指针和单词地址都能固定大小。

3.3.2 文档编号重排
对文档ID重编号使得倒排列表中相邻两个文档的编号也尽可能相邻,使相邻文档的D-Gap值尽可能小,压缩算法效率会更高。具体算法不展开。

3.3.3 静态索引裁剪(static index pruning)
这是一种有损压缩,清除索引项中不重要的部分,同时尽可能保证搜索质量。常用的两种方法:以单词为中心的索引裁剪和以文档为中心的索引裁剪。

以单词为中心的索引裁剪需要计算单词与其对应的文档的相似性,据此判断是否保留索引项。索引建立好之后裁剪。

以文档为中心的裁剪计算单词的重要性,抛弃不重要的单词。建立索引之前裁剪。

至此,搜索引擎完成了网页数据的获取与存储,其余部分将在接下来的文章中介绍。

这个系列的文章是一只试图通过产品角度出发去理解复杂庞大搜索引擎的汪写出来的,不足之处很多,欢迎广大技术、非技术同学阅读后指正错误,我们一起探讨共同进步。

本篇主要介绍搜索引擎的检索模型和搜索排序。就是利用某种检索模型从海量数据中挑选“好的”网页经过排序后生成最终结果推送给用户。搜索结果排序是是搜索引擎最核心的部分,决定了搜索引擎质量好坏。排序中最重要的两个因素是查询内容相关性和网页链接情况。

一、内容相关性
       判断相关性依赖于搜索引擎使用的检索模型。下图是内容相似性计算框架,用户发出搜索请求,检索模型根据请求计算网页相关性返回检索结果,可以看出检索模型对内容相关性起着决定性作用。

1.1常用的检索模型
1.1.1 布尔模型(boolean model)
文档与查询query二者包含单词做布尔运算,判定query与文档的相似性。这种方法输出结果只有相关和不相关,过于粗糙,实际中应用较少。

1.1.2 空间向量模型(vector space model)
思想:将文档看做由t维特征组成的向量,常用单词作为特征,每个特征根据一定依据计算权重,最终带权重的特征构成文档,以此来表示网页的 主要内容。通过计算文档特征与查询特征向量之间的cosine值来计算相似性。

特征权值的计算一般采用Tf*IDF框架。TF代表词频,Tf越大则该词的权重越大。IDF代表逆文档频率因子,代表单词在文档集合里的频率。特征词出现在越多文档,则IDF权重越小,IDF代表了单词所带信息量的多少。Tf*IDF框架一般吧TF权值和IDF权值相乘得到特征的权值。

缺点:cosine值会对长文档进行抑制。

1.1.3 概率检索模型
       由概率排序原理推导出来,具体原理么看懂,但这个是目前效果最好的模型之一,okapi BM25这一经典概率模型在商业搜索引擎页面排序中广泛使用。

1.1.4 语言模型
       为每个文档建立不同的语言模型,判断由文档生成用户查询的可能性,按照生成概率高低排序。我理解为将文档中的单词分组,类似于从不同盒子里抽红球、白球的问题,计算从不同组抽单词组成用户query的概率。语言模型代表了单词或单词序列在文档中的分布情况。

1.1.5 机器学习
机器学习排序系统由4个步骤组成:人工标注训练数据、文档特征提取、学习分类函数、实际搜索系统中采用机器学习模型。人工标注数据目前常用用户点击记录来模拟。机器学习排序原理如下:

其中的机器学习系统又有三种常见方法,如下,

单文档方法:机器学习系统对文档打分,打分结果即为搜索结果。相似性判断是二元的,即要么相关要么不相关。

文档对方法:侧重在于对任意两个文档组成的文档对<Doc1,Doc2>的顺序关系是否合理进行判断。

文档列表方法:将查询对应的所有搜索结果列表整体作为机器学习训练的实例。

1.2 检索质量评价标准
通常来说检索使用精准率和召回率来评判,精准率是指一次搜索结果中相关文档所占的比例;召回率指一次搜索结果中包含的相关文档占整个集合中所有相关文档的比例。

对于搜索引擎来,精准率更多重要,因为引擎处理海量数据,查找所有相关文档较难;此外搜索结果一部分即可满足用户需求。常用搜索引擎精度评估指标为P@10和MAP。

P@10:关注搜索结果前10个文档中相关比例。

MAP(mean averageprecision):多次查询的平均准确率。每个相关文档的理想排名除以实际排名得到的分数均值为ap指标,多组查询的ap值求平均即为Map指标。该方法能兼顾相关性和召回率。

二、网页链接分析
一个网页除了与用户输入query计算相关性外,自身也有质量高低,需要根据网页质量对相关性检索排序进行调整。而链接分析就是用来判断网页重要性的。

2.1 一些基本概念
常用网页链接分析模型有随机游走模型和子集传播模型。

随机游走模型(random surfer model):用户在一个页面打开该页面的任何一个出链的概率是相同的。不断重复出链过程,在相互有链接指向的页面之间跳转。而直接在浏览器中输入网址跳转称为远程跳转(teleporting)。


子集传播模型:将互联网网页按照规则划分为多个具有特殊属性的子集,给予子集内网页初始权值,然后按照链接关系将权值传递到其他网页。

2.2 常见链接分析算法
2.2.1PageRank算法
pagerank是谷歌开发的一套链接分析方法,具有很强的实用价值。Pagerank有两个基本假设,数量假设:一个页面接收到的其他网页指向的入链数量越多,这个网页越重要。质量假设:越质量高的页面指入,则页面越重要。

Pagarank算法思想:为每个网页赋予相同的重要性,通过迭代递归计算更新每个页面节点的pagerank得分,直到得分趋于稳定。

需注意链接陷阱(link sink)。链接相互指向,形成环形结构,从而形成链接陷阱。链接陷阱内页面pagerank的得分会越来越高。为解决该问题,为网页添加跳转至任意其他页面的概率,即远程跳转。相当于为每个页面增加了指向互联网任意页面的虚拟边,权值可以通过虚拟边向外传递,避免链接陷阱导致的问题。

2.2.2HiTS算法
两个基本概念Hub页面:很多指向高质量authority页面链接的网页,如hao123首页;Authority页面:与某个领域或话题相关的高质量网页,如搜索领域的google和百度首页。

两个基本假设:一个好的authority页面会被很多好的hub页面指向;一个好的hub页面会指向很多好的authority页面。Authority页面和hub页面是相互增强的关系。

算法思想:通过用户搜索获得排名靠前的网页,组成根集(root set),然后将与根集有直接链接指向关系的网页扩充进行形成扩展网页集合,每个网页设置hub和authority权值,利用相互增强关系等原则进行多次迭代计算,直到权值稳定,最终使用权值排序。

问题:计算效率低、主题漂移、易被作弊者操纵结果、结果不稳定。

其余链接分析算法:salas算法、主题敏感pagerank、hilltop算法、智能游走模型、偏置游走模型、PHITS算法、BFS算法。(没细看,有兴趣可以去看《这就是搜索引擎》这本书)。

就这样,搜索引擎利用网页内容相关性及网页链接情况得到网页排序推送给用户。至此(一)、(二)篇已经介绍了搜索引擎通过爬虫获取数据、建立索引并通过内容相关和链接分析对网页排序来响应用户的query请求,下一节将介绍搜索引擎的优化。
--------------------- 


   
  说爬虫是搜索引擎的一个模块,爬虫从互联网上爬取大量的页面然后存储到本地。

搜索引擎要素
  相关性、可信赖性、用户需求。 
  用户需求是说,对于相同的关键字,在不同的场景下用户的实际需求可能是不一样的,如何准确识别的问题。

网络爬虫
  有批量型爬虫、垂直型爬虫和增量型爬虫。

  爬虫的友好性是说,要准从某些约定:有些网站出于隐私考虑,可能对某些文件夹下的页面不允许抓取;另一方面,过多地对特定网站的爬取会导致网络负载过大,影响正常访问。 
因此有网络禁抓协议(Robot Exclusion Protocol),对应根目录下robot.txt, 指明了哪些目录下的网页不允许爬取。还有页面禁抓标记(meta, robots, noindex or nofollow)。另外为了尽量降低对网站负载的影响,减少对单一站点的高频访问。

爬虫的抓取策略
简单来说就是如何对待爬取的URL队列中的元素进行排序。主要有如下几类: 
1. 宽度优先搜索策略 
最原始的,简单直观的方法,效果还不错。隐含了一定程度上的优先级策略:因为如果入链多的话更有可能会被优先搜索到,因此。 
2. 非完全PageRank策略 
完整的PageRank策略是基于全网的全局Rank计算得到的,但是在爬取的过程中是不可能获取完整的网页信息的,所以只能根据已经下载到本地的页面进行部分的非完全的PageRank值计算,有一定的效果,但是不一定优于宽搜的方式。 
3. OCIP策略(Online Page Importance Computation) 
将页面的URL对应的权重均分给页面内的子链,这样动态计算链接的权重。效果不错。 
4. 大站优先策略。

网页更新策略
基于历史更新周期数据
基于用户体验:看网页变化对搜索排名结果的影响,靠前的优先更新。
基于聚类分析:对新网页较好,是使用较多的一类。
暗网抓取策略
对于一些根据用户请求动态生成的页面,一些垂直网站比如携程的订票查询页面,需要用户输入一些数据然后才从后台数据库返回对应的页面。这些页面是明网页面数量的上百倍。 
爬虫要爬取这些暗网数据,需要解决两个问题:查询组合和文本框输入。 
查询组合:遍历所有的查询组合,很多包含的信息量较少,而且会产生巨大的流量压力。基于查找其中富含信息的查询模板,ISIT算法较为有效。 
文本框。。。

分布式爬虫
主从式爬虫:对URL服务器依赖。
对等式爬虫:URL的hash取模法分配对节点损坏问题不能很好解决。采用一致性hash法较好解决此问题。
 

猜你喜欢

转载自blog.csdn.net/c2289206/article/details/89853489
今日推荐