搜索引擎的基本原理及构成

2021年6月21日 2点热度 0条评论 来源: JXH_123

【说明】:本文转自
http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=23480159&id=2421718


引言

首先,所谓“搜索引擎”,说到底是一个网络应用软件系统。从网络用户的角度看,它根据用户提交的类自然语言查询词或者短语,返回一系列很可能与该查询相关的网页信息,供用户进一步判断和选取。为了有效地做到这一点,它大致上被分成三个功能模块,或者三个子系统;即网页搜集,预处理和查询服务,这三个部分是相对独立的,它们的工作形成了搜索引擎工作的三个阶段。

基本要求

如前述,搜索引擎是一个网络应用软件系统,对它有如下基本要求:

能够接受用户通过浏览器提交的查询词或者短语,记作q,例如“非典”,“伊拉克战争”,“床前明月光”等等。在一个 可以接受的时间内 返回一个和该用户查询 匹配 的网页信息 列表 ,记作L。这个列表的每一条目至少包含三个元素(标题,网址链接,摘要)。

这里有三个问题需要注意,分别对应以上的黑体字:

“可以接受的时间”,也就是响应时间。对于在Web上面向广大用户提供服务的软件来说,这个时间不能太长。这是衡量搜索引擎可用性的一个基本指标,也是和传统信息检索系统的一个差别。更进一步的,这样的响应时间要求不仅要能满足单个用户查询,而且要能在系统设计负载的情况下满足所有的用户。也就是说,系统应该在额定吞吐率的情况下保证秒级响应时间。

“匹配”,指的是网页中以某种形式包含有q的内容,其中最简单、最常见的形式就是q在其中直接出现。不过如果一个搜索引擎就是以百分之百满足这种简单的包含关系为目标,即使实现了也并不就达到了最好的效果。

“列表”这蕴含着一种“序”(rank)。在绝大多数情况下,L是相当长的,例如超过一万个条目(这是和图书馆全文检索系统的又一个不同,那里返回的列表通常较短,例如几十个条目)。这不仅是由于Web上的信息量大,也由于搜索引擎的查询方式简单。简单,意味着抽象;抽象,意味着有更多的具体事物可能是它的体现。对于一个长长的列表,很少有用户有耐心都审视一遍(不仅是因为长,还因为大多数使用搜索引擎的用户通常都是“找到为止”,而不是“不全部找到不罢休”,加上这个列表中和一个用户关心的其实只占很少的比例)。有分析统计表明,用户平均察看返回结果不超过2页。

现代大规模高质量搜索引擎一般采用如下图所示的称之为三段式的工作流程,即:网页搜集、预处理和查询服务。

网页采集

搜索引擎这样一个软件系统应该是以何种方式工作?如果说软件系统是工作在某个数据集合上的程序的话,这个软件系统操作的数据不仅包括内容不可预测的用户查询,还要包括在数量上动态变化的海量网页,并且这些网页不会主动送到系统来,而是需要由系统去抓取。

首先,我们考虑抓取的时机:事先还是即时。我们都有经验,在网络比较畅通的情况下,从网上下载一篇网页大约需要1秒钟左右,因此如果在用户查询的时候即时去网上抓来成千上万的网页,一个个分析处理,和用户的查询匹配,不可能满足搜索引擎的响应时间要求。不仅如此,这样做的系统效益也不高(会重复抓取太多的网页);面对大量的用户查询,不可能想象每来一个查询,系统就到网上“搜索”一次。 因此我们看到,大规模搜索引擎服务端基础应该是一批预先搜集好的网页(直接或间接)。这一批网页如何维护?可以有两种基本的考虑。

定期搜集,每次搜集替换上一次的内容,我们称之为“批量搜集”。由于每次都是重新来一次,对于大规模搜索引擎来说,每次搜集的时间通常会花几周。而由于这样做开销较大,通常两次搜集的间隔时间也不会很短(例如早期天网的版本大约每3个月来一次,Google在一段时间曾是每隔28天来一次)。这样做的好处是系统实现比较简单,主要缺点是“时新性”(freshness)不高,还有重复搜集所带来的额外带宽的消耗。

增量搜集,开始时搜集一批,往后只是(1)搜集新出现的网页,(2)搜集那些在上次搜集后有过改变的网页,(3)发现自从上次搜集后已经不再存在了的网页,并从库中删除。由于除新闻网站外,许多网页的内容变化并不是很经常的(有研究指出50%网页的平均生命周期大约为50天),这样做每次搜集的网页量不会很大,于是可以经常启动搜集过程(例如每天)。30万网页,一台PC机,在一般的网络条件下,半天也就搜集完了。这样的系统表现出来的信息时新性就会比较高,主要缺点是系统实现比较复杂;这种复杂还不仅在于搜集过程,而是还在于下面要谈到的建索引的过程。

上面讲的是系统网页数据库维护的基本策略。在这两种极端的情况之间也可能有一些折中的方案,J. Cho博士在这方面做过深入的研究,根据一种网页变化模型和系统所含内容时新性的定义,提出了相应优化的网页搜集策略。其中一个有趣的结论是:在系统搜集能力一定的情况下,若有两类网页(例如“商业”和“教育”),它们的更新周期差别很大(例如“商业”类网页平均更新周期是“天”,而“教育”类网页平均更新周期是“月”),则系统应该将注意力放在更新慢的网页上,以使系统整体的时新性达到比较高的取值。

在具体搜集过程中,如何抓取一篇篇的网页,也可以有不同的考虑。最常见的一种是所谓“爬取”:将Web上的网页集合看成是一个有向图,搜集过程从给定起始URL集合S(或者说“种子”)开始,沿着网页中的链接,按照先深、先宽、或者某种别的策略遍历,不停的从S中移除URL,下载相应的网页,解析出网页中的超链接URL,看是否已经被访问过,将未访问过的那些URL加入集合S。整个过程可以形象地想象为一个蜘蛛(spider)在蜘蛛网(Web)上爬行(crawl)。后面我们会看到,真正的系统其实是多个“蜘蛛”同时在爬。

这种方式的好处除了概念很漂亮,一般实现起来也不困难外,还有很重要的一条是容易通过一定的策略,使搜集到的网页相对比较“重要”。前面提过,任何搜索引擎是不可能将Web上的网页搜集完全的,通常都是在其他条件的限制下决定搜集过程的结束(例如磁盘满,或者搜集时间已经太长了)。因此就有一个尽量使搜到的网页比较重要的问题,这对于那些并不追求很大的数量覆盖率的搜索引擎特别重要。研究表明,按照先宽搜索方式得到的网页集合要比先深搜索得到的集合重要(这里当然有一个重要性的指标问题)。这种方式的一个困难是要从每一篇网页中提取出所含的URL。由于HTML的灵活性,其中出现URL 的方式各种各样,将这个环节做得彻底不容易(例如我们现在还没有很好的简单办法从JavaScript脚本中提取URL)。同时,由于Web的“蝴蝶结” 形状这种方式搜集到的网页不大会超过所有目标网页数量2的2/3。

另外一种可能的方式是在第一次全面网页搜集后,系统维护相应的URL集合S,往后的搜集直接基于这个集合。每搜到一个网页,如果它发生变化并含有新的URL,则将它们对应的网页也抓回来,并将这些新URL也放到集合S中;如果S中某个url对应的网页不存在了,则将它从S中删除。这种方式也可以看成是一种极端的先宽搜索,即第一层是一个很大的集合,往下最多只延伸一层。 还有一种方法是让网站拥有者主动向搜索引擎提交它们的网址(为了宣传自己,通常会有这种积极性),系统在一定时间内(2天到数月不等)定向向那些网站派出 “蜘蛛”程序,扫描该网站的所有网页并将有关信息存入数据库中。大型商业搜索引擎一般都提供这种功能。

预处理

得到海量的原始网页集合,距离面向网络用户的检索服务之间还有相当的距离。宏观地看,服务子系统是一个程序。采用Wirth关于“程序 = 算法+数据结构”的观点来考察这个程序,一个合适的数据结构是查询子系统工作的核心和关键。这里只是指出:现行最有效的数据结构是“倒排文件” (inverted file);倒排文件是用文档中所含关键词作为索引,文档作为索引目标的一种结构(类似于普通书籍中,索引是关键词,书的页面是索引目标)。下面以 常规全文搜索引擎 为例讨论从网页集合形成这样的倒排文件过程中的几个主要问题,即我们所说的 “预处理”。主要包括四个方面,关键词的提取,“镜像网页”(网页的内容完全相同,未加任何修改)或“转载网页”(near-replicas,主题内容基本相同但可能有一些额外的编辑信息等,转载网页也称为“近似镜像网页”)的消除,链接分析和网页重要程度的计算。

关键词的提取

随便取一篇网页的源文件(例如通过浏览器的“查看源文件”功能),我们可以看到其中的情况纷乱繁杂。除了我们从浏览器中能够正常看到的文字内容外,还有大量的HTML标记。根据天网统计,网页文档源文件的大小(字节量)通常大约是其中内容大小的4倍。另外,由于HTML文档产生来源的多样性,许多网页在内容上比较随意,不仅文字不讲究规范、完整,而且还可能包含许多和主要内容无关的信息(例如广告,导航条,版权说明等)。这些情况既给有效的信息查询带来了挑战,也带来了一些新的机遇。这里我们只是指出,为了支持后面的查询服务,需要从网页源文件中提取出能够代表它的内容的一些特征。从人们现在的认识和实践来看,所含的关键词即为这种特征最好的代表。于是,作为预处理阶段的一个基本任务,就是要提取出网页源文件的内容部分所含的关键词。对于中文来说,就是要根据一个词典Σ,用一个所谓“切词软件”,从网页文字中切出Σ所含的词语来。在那之后,一篇网页主要就由一组词来近似代表了,p = {t1, t2, …, tn}。一般来讲,我们可能得到很多词,同一个词可能在一篇网页中多次出现。从效果(effectiveness)和效率(efficiency)考虑,不应该让所有的词都出现在网页的表示中,要去掉诸如“的”,“在”等没有内容指示意义的词,称为“停用词”(stop word)。这样,对一篇网页来说,有效的词语数量大约在200个左右。

重复或转载网页的消除

与生俱来的数字化和网络化给网页的复制以及转载和修改再发表带来了便利,因此我们看到Web上的信息存在大量的重复现象。天网在2003年的一次大规模统计分析表明,网页的重复率平均大约为4。也就是说,当你通过一个URL在网上看到一篇网页的时候,平均还有另外3个不同的URL也给出相同或者基本相似的内容。这种现象对于广大的网民来说是有正面意义的,因为有了更多的信息访问机会。但对于搜索引擎来说,则主要是负面的;它不仅在搜集网页时要消耗机器时间和网络带宽资源,而且如果在查询结果中出现,无意义地消耗了计算机显示屏资源,也会引来用户的抱怨,“这么多重复的,给我一个就够了”。因此,消除内容重复或主题内容重复的网页是预处理阶段的一个重要任务。

链接分析

前面提到,大量的HTML标记既给网页的预处理造成了一些麻烦,也带来了一些新的机遇。从信息检索的角度讲,如果系统面对的仅仅是内容的文字,我们能依据的就是“共有词汇假设”(shared bag of words),即内容所包含的关键词集合,最多加上词频(term frequency 或tf、TF)和词在文档集合中出现的文档频率(document frequency 或df、DF)之类的统计量。而TF和DF这样的频率信息能在一定程度上指示词语在一篇文档中的相对重要性或者和某些内容的相关性,这是有意义的。有了 HTML标记后,情况还可能进一步改善,例如在同一篇文档中,<H1>和</H1>之间的信息很可能就比在<H4> 和</H4>之间之间的信息更重要。特别地,HTML文档中所含的指向其他文档的链接信息是人们近几年来特别关注的对象,认为它们不仅给出了网页之间的关系,而且还对判断网页的内容有很重要的作用。例如“北大学报”这几个字在北京大学学报社会科学版的主页上是没有的,因此一个仅靠内容文字分析的搜索引擎就不可能返回该主页作为结果。但是北京大学主页上是用“北大学报(社)”作为链接信息指向了北京大学学报社会科学版的主页。因此在很好利用链接信息的搜索引擎中应该能返回北京大学学报社会科学版的主页。

网页重要程度的计算

搜索引擎返回给用户的,是一个和用户查询相关的结果列表。列表中条目的顺序是很重要的一个问题。由于面对各种各样的用户,加之查询的自然语言风格,对同样的q0返回相同的列表肯定是不能使所有提交q0的用户都满意的(或者都达到最高的满意度)。因此搜索引擎实际上追求的是一种统计意义上的满意。人们认为Google目前比天网好,是因为在多数情况下前者返回的内容要更符合用户的需要,而不是所有情况下都如此。如何对查询结果进行排序有很多因素需要考虑,这里只是概要解释在预处理阶段可能形成的所谓“重要性”因素。顾名思义,既然是在预处理阶段形成的,就是和用户查询无关的。如何讲一篇网页比另外一篇网页重要?人们参照科技文献重要性的评估方式,核心想法就是“被引用多的就是重要的”。“引用”这个概念恰好可以通过HTML超链在网页之间体现得非常好,作为Google创立核心技术的PageRank就是这种思路的成功体现。除此以外,人们还注意到网页和文献的不同特点,即一些网页主要是大量对外的链接,其本身基本没有一个明确的主题内容,而另外有些网页则被大量的其他网页链接。从某种意义上讲,这形成了一种对偶的关系,这种关系使得人们可以在网页上建立另外一种重要性指标。这些指标有的可以在预处理阶段计算,有的则要在查询阶段计算,但都是作为在查询服务阶段最终形成结果排序的部分参数。

查询服务

如上述,从一个原始网页集合S开始,预处理过程得到的是对S的一个子集的元素的某种内部表示,这种表示构成了查询服务的直接基础。对每个元素来说,这种表示至少包含如下几个方面:

  • 原始网页文档
  • URL和标题
  • 编号
  • 所含的重要关键词的集合(以及它们在文档中出现的位置信息)
  • 其他一些指标(例如重要程度,分类代码等)

而系统关键词总体的集合和文档的编号一起构成了一个倒排文件结构,使得一旦得到一个关键词输入,系统能迅速给出相关文档编号的集合输出。然而,如同我们在之前提到的,用户通过搜索引擎看到的不是一个“集合”,而是一个“列表”。如何从集合生成一个列表,是服务子系统的主要工作。从搜索引擎系统功能划分的角度,有时候将倒排文件的生成也作为服务子系统的一部分功能,但我们这里将它划分到预处理阶段中觉得更方便些。换句话讲,服务子系统是在服务进行的过程中涉及的相关软件程序,而为这些软件程序事先准备数据的程序都算在预处理子系统中。下面来看对服务子系统的要求和其工作原理,主要有三个方面。

查询方式和匹配

查询方式指的是系统允许用户提交查询的形式。考虑到各种用户的不同背景和不同的信息需求,不可能有一种普适的方式。一般认为,对于普通网络用户来说,最自然的方式就是“要什么就输入什么”。但这是一种相当模糊的说法。例如用户输入“北京大学”,可能是他想了解北京大学目前有些什么信息向外发布,想看看今年的招生政策(于是希望看的是北大网站上的内容),也可能是他想了解外界目前对北京大学有些什么评价(于是希望看到的是其他权威网站上关于北大的消息)。这是两种相当不同的需求。在其他一些情况下,用户可能关心的是间接信息,例如“喜马拉雅山的高度”,8848米应该是他需要的,但不可能包含在这短语中。而用户输入“惊起一滩鸥鹭”则很可能是想知道该词的作者是谁,或者希望能提醒前面几句是什么。尽管如此,用一个词或者短语来直接表达信息需求,希望网页中含有该词或者该短语中的词,依然是主流的搜索引擎查询模式。这不仅是因为它的确代表了大多数的情况,还因为它比较容易实现。这样,一般来讲,系统面对的是查询短语。就英文来说,它是一个词的序列;就中文来说,它是包含若干个词的一段文字。一般地,我们用q0表示用户提交的原始查询,例如,q0 =“网络与分布式系统实验室”。它首先需要被“切词”(segment)或称“分词”,即把它分成一个词的序列。如上例,则为“网络 与 分布式 系统 实验室”(注意,不同的分词软件可能得出不同的结果,这里用的是北大计算语言所的在线分词软件)。然后需要删除那些没有查询意义或者几乎在每篇文档中都会出现的词(例如“的”),在本例中即为“与”。最后形成一个用于参加匹配的查询词表,q = {t1, t2, …, tm},在本例中就是q = {网络,分布式,系统,实验室}。前面讲过,倒排文件就是用词来作为索引的一个数据结构,显然,q中的词必须是包含在倒排文件词表中才有意义。有了这样的 q,它的每一个元素都对应倒排文件中的一个倒排表(文档编号的集合),记作L(ti),它们的交集即为对应查询的结果文档集合,从而实现了查询和文档的匹配。上述过程的基本假设是:用户是希望网页包含所输入查询文字的。

结果排序

上面,我们了解了得到和用户查询相关的文档集合的过程。这个集合的元素需要以一定的形式通过计算机显示屏呈现给用户。就目前的技术情况看,列表是最常见的形式(但人们也在探求新的形式,如Vivisimo 引擎将结果页面以类别的形式呈现)。给定一个查询结果集合,R={r1, r2, …, rn},所谓列表,就是按照某种评价方式,确定出R中元素的一个顺序,让这些元素以这种顺序呈现出来。笼统地讲,ri和q的相关性(relevance)是形成这种顺序的基本因素。但是,有效地定义相关性本身是很困难的,从原理上讲它不仅和查询词有关,而且还和用户的背景,以及用户的查询历史有关。不同需求的用户可能输入同一个查询,同一个用户在不同的时间输入的相同的查询可能是针对不同的信息需求。为了形成一个合适的顺序,在搜索引擎出现的早期人们采用了传统信息检索领域很成熟的基于词汇出现频度的方法。大致上讲就是一篇文档中包含的查询(q)中的那些词越多,则该文档就应该排在越前面;再精细一些的考虑则是若一个词在越多的文档中有出现,则该词用于区分文档相关性的作用就越小。这样一种思路不仅有一定直觉上的道理,而且在倒排文件数据结构上很容易实现。因为,当我们通过前述关键词的提取过程,形成一篇文档的关键词集合,p = {t1, t2, …, tn}的时候,很容易同时得到每一个ti在该文档中出现的次数,即词频,而倒排文件中每个倒排表的长度则对应着一个词所涉及的文档的篇数,即文档频率。然而,由于网页编写的自发性、随意性较强,仅仅针对词的出现来决定文档的顺序,在Web上做信息检索表现出明显的缺点,需要有其他技术的补充。这方面最重要的成果就是前面提到过的PageRank。通过在预处理阶段为每篇网页形成一个独立于查询词(也就和网页内容无关)的重要性指标,将它和查询过程中形成的相关性指标结合形成一个最终的排序,是目前搜索引擎给出查询结果排序的主要方法。

文档摘要

搜索引擎给出的结果是一个有序的条目列表,每一个条目有三个基本的元素:标题,网址和摘要。其中的摘要需要从网页正文中生成。一般来讲,从一篇文字中生成一个恰当的摘要是自然语言理解领域的一个重要课题,人们已经做了多年的工作并取得了一些成果。但相关的技术用到网络搜索引擎来有两个基本困难。一是网页的写作通常不规范,文字比较随意,因此从语言理解的角度难以做好;二是复杂的语言理解算法耗时太多,不适应搜索引擎要高效处理海量网页信息的需求。因此搜索引擎在生成摘要时要简便许多,基本上可以归纳为两种方式,一是静态方式,即独立于查询,按照某种规则,事先在预处理阶段从网页内容提取出一些文字,例如截取网页正文的开头512个字节(对应256个汉字),或者将每一个段落的第一个句子拼起来,等等。这样形成的摘要存放在查询子系统中,一旦相关文档被选中与查询项匹配,就读出返回给用户。显然,这种方式对查询子系统来说是最轻松的,不需要做另外的处理工作。但这种方式的一个最大的缺点是摘要和查询无关。一篇网页有可能是多个不同查询的结果,例如当用户分别查询“北大计算机网络”和“北大分布式系统”,"北大天网"在两种情况下应该都作为结果返回。当用户输入某个查询,他一般是希望摘要中能够突出显示和查询直接对应的文字,希望摘要中出现和他关心的文字相关的句子。因此,我们有了“动态摘要”方式,即在响应查询的时候,根据查询词在文档中的位置,提取出周围的文字来,在显示时将查询词标亮。这是目前大多数搜索引擎采用的方式。为了保证查询的效率,需要在预处理阶段分词的时候记住每个关键词在文档中出现的位置。 除上述外,查询服务返回的内容还有一些细节的支持。例如,对应一个查询往往会有成千上万的结果,返回给用户的内容通常都是按页组织的,一般每页显示 10个结果。统计表明,网络用户一般没有耐心一页页看下去,平均翻页数小于2。这告诉我们将第一页的内容组织好非常重要。如果希望用户多用搜索引擎,就要让第一页的内容尽量有吸引力。

体系结构

在上述工作原理的基础上,作为一个网络应用软件,我们可以勾画出搜索引擎的体系结构,其中的大部分模块和前面的原理描述有直接的对应。这里需要特别讨论的是还没有专门提及的“控制器”模块。网页的搜集,如果只是为了做些简单的实验,不过上万篇网页的话,许多矛盾都不会出现,可以用最简单的工具(例如wget)完成。但如果是为了向大规模搜索引擎稳定地提供网页数据,通常需要每天搜集上百万网页,而且是持续进行,情况则要复杂许多,核心是要综合解决效率、质量和“礼貌”的问题。这就是“控制器”的作用。

 

所谓效率,在这里就是如何利用尽量少的资源(计算机设备、网络带宽、时间)来完成预定的网页搜集量。在批量搜集的场合,我们通常考虑半个月左右能搜集到的网页,自然是越多越好。由于网页之间存在的独立性,利用许多台计算机同时来做这项工作是一个吸引人的想法。这里需要指出三点:第一,即使是用一台计算机来搜集网页,也应该注意并发性的开发和利用。由于从网上抓取一篇网页通常需要秒量级的等待网络通信时间,同时启动多个抓取进程/线程,或者利用操作系统提供的异步通信机制,让多个网络通信时间重叠起来,让网络通信时间和存放网页的磁盘访问时间重叠起来是很有意义的。同时启动抓取进程的数量取决于硬件条件和搜集软件的设计,一般情况下可以上百个,做得好也可能上千个(即上千个进程也不会造成CPU成为瓶颈)。

影响搜集效率的另一点发生在网络的另一端,即服务器方,它可能来不及提供所需的网页。这除了有些Web服务器所处的网络条件比较差,或者有太多其他人访问外,搜索引擎太频繁对它们发出网页请求也是一个重要原因。落实到技术上,就是要有一个访问策略或者URL规划,不要让搜集器启动的抓取进程都集中在少数几个网站上。

将搜集活动的关注过分集中在几个网站上,或者在一小段时间里从一个网站抓取太多的网页还可能引起其他的严重后果,即所谓“礼貌”问题。一般来讲,网站的管理人员都很愿意让自己的网页被搜索引擎索引,从而有可能得到更多的访问流量;但这只是问题的一方面。问题的另一方面是网站绝不希望由于搜索引擎的“密集”抓取活动阻碍了普通用户通过浏览器的访问,使那些用户得到这个网站访问起来很困难的印象,从而不再光顾。不加控制的网页抓取,给网站造成的现象有时候和制造拒绝服务(Denial of Servide, DoS)攻击的黑客造成的现象一样。因此,管理良好的网站常常会有一个监视器运行,监视是否有来源于单个IP地址的过分密集的访问。一旦出现这种情况,要么会通告该IP地址的拥有者注意行为,或者会干脆屏蔽来自它的访问,更有甚者还可能直接将该IP地址拉入黑名单。因此,适当地规划网页的抓取,限制单位时间内对一个网站抓取网页的数量(例如每天不超过2万个,或者至少每隔30秒才对同一个网站发出下一个网页请求,等等),是大规模搜索引擎必须要认真对待的问题。总之,搜索引擎需要和网站“和睦相处”,它们是相互依存的。

所谓质量问题,指的是在有限的时间,搜集有限的网页,希望它们尽量是比较“重要”的网页,或者说不要漏掉那些很重要的网页。哪些网页是比较重要的?也是仁者见仁,智者见智的,不可能有一个统一认可的标准。如果让重要性和流行度等同起来,即越多人看过的网页越重要,至少是直觉上有一定道理的。这样,我们可以考虑一个网站从主页开始向下,按照链接的深度将网页组织成一层层的,上层中的网页统计上会比下层的网页重要些。这样一种认识通过 PageRank得到了加强,即较靠近主页的网页通常PageRank值较高。这样,首先得到尽量多的主页,然后从主页开始的先宽搜索就应该是一个较好的策略。

网页搜集过程中还有一个基本的问题是要保证每个网页不被重复抓取。由于一篇网页可能被多篇网页链接,在spider爬取过程中就可能多次得到该网页的url。于是如果不加检查和控制,网页就会被多次抓取。遇到循环链接的情况,还会使爬取器陷死。解决这个问题的有效方法是使用两个表,unvisited_table和visited_table。前者包含尚未访问的url,后者记录已访问的url。系统首先将要搜集的种子url放入unvisited_table,然后 spider从其中获取要搜集网页的url,搜集过的网页url放入visited_table中,新解析出的并且不在visited_table中的 url加入unvisited_table。此方法简单明了,适合在单个节点上实现。但是当搜集子系统涉及到多个节点的时候,如何避免各个节点之间的重复工作就复杂了,还要考虑网络的通信量、负载平衡、以及单个节点性能瓶颈等问题。

一般性指标

搜索引擎可以归结为信息检索问题,即在由网页组成的文档集合中检索出与用户查询相关的文档。因此,可用衡量传统信息检索系统的性能参数—召回率(查全率/Recall)和精度(查准率/Precision)来衡量搜索引擎的性能。

召回率指检索出的相关文档数与文档集中所有的相关文档数的比率,它衡量检索系统(搜索引擎)的查全率。精度指检索出的相关文档数与检索出的文档总数的比率,它衡量检索系统(搜索引擎)的查准率。对于任一个检索系统,召回率和精度都不可能两全其美。召回率高,精度低。精度高,召回率低。对于搜索引擎系统,由于一个查询总能返回很多信息,所以召回率一般不成问题。目前,搜索引擎系统更关心精度,即是否为用户提供了相关度很高的、高质量的导航信息。

搜索引擎系统其它的性能衡量指标还包括响应时间、支持峰值查询能力、易用性、返回结果的有效性(是否为死链、重复、过时信息)等。影响一个搜索引擎系统性能的因素很多,主要集中在信息搜集策略和检索模型,包括索引库的更新频率和策略、文档和查询的表示方法、评价文档和用户查询相关性的匹配策略、查询结果的排序方法和用户进行相关度反馈的机制等。

    原文作者:JXH_123
    原文地址: https://blog.csdn.net/JXH_123/article/details/45725837
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。