大型超文本网络搜索引擎的剖析_第1页
大型超文本网络搜索引擎的剖析_第2页
大型超文本网络搜索引擎的剖析_第3页
大型超文本网络搜索引擎的剖析_第4页
大型超文本网络搜索引擎的剖析_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、大型超文本网络搜索引擎的剖析Sergey Brin和Lawrence Page Computer Science Department Stanford Unversity, Stanford, CA 94305, USA 和摘要: 本文介绍了一个在超文本中广泛应用的大型搜索引擎Google的原型。Google的设计使之能够高效地抓取网络信息并为之建立索引,它的查询结果比现存的其它系统都要更令人满意。这个原型的全文和至少含有2千4百万个页面的超链接数据库可以从/下载

2、。设计一个搜索引擎是一项富有挑战性的工作。搜索引擎要为上百亿包含等量的不同词汇的网页建立索引。它们每天要接受上亿次的查询。尽管大型的搜索引擎在网络上是非常重要的,但是在学术上却没有多少对它的研究。另外,由于技术的突飞猛进和网页量的剧增,在今天要搭建一个网络搜索引擎比起三年前是大有不同的。本文对我们的大型网络搜索引擎提供了一份深层次的介绍据我们所知,这是公开发表的论文中第一篇描述得如此详尽的。除了在把传统搜索技术应用到如此数量级的数据中遇到的问题以外,还有一些新的技术上的挑战,比如利用超文本中的附加信息来改善搜索结果。本文将着手解决这个问题,如何搭建一个实用的大型系统来发掘超文本中的附加信息。我

3、们还将要关注如何有效地处理无组织的任何人都能随意发布任何信息的超文本数据集。 关键词 万维网,搜索引擎,信息检索,PageRank算法,Google 1 绪论 (注意:这篇论文有两个版本一个长一些的全文版本,一个精简一些的打印版本(/backrub/google.html)。全文版本可以在网上下载,也可以在研讨会的CD-ROM上找到。) 万维网给信息检索带来了新的挑战。万维网上的信息量在飞速增长,同时网络研究艺术中一些缺乏经验的新用户的数量也在激增。人们一般利用网络上的超链接来网上冲浪,一般都是从高质量人工维护的索引开始,比如Yahoo!或者

4、搜索引擎。人工维护的目录虽然有效地包含了流行的话题,但是它具有主观性、搭建和维护的代价高、升级缓慢,并且无法涵盖所有严肃深奥的主题。基于关键词匹配的自动搜索引擎有经常返回一些低质量结果。更糟的是,有些广告商专门设法误导自动搜索引擎来吸引人们的注意。我们已经建立了一个大型搜索引擎能解决现存系统中的很多问题。它专门利用了超文本中的附加信息来提高搜索结果的质量。我们选择 Google作为我们系统的名字,取自一个俗语googol的谐音,意思是10的100次方,这和我们建立一个大型搜索引擎的目标是相当吻合的。 1.1 网络搜索引擎升级:19942000 搜索引擎技术不得不经常调整以跟上网络的增长。199

5、4年,第一批网络搜索引擎中的World Wide Web Worm(WWWW)索引了110000篇网页和有效的网络文件。到了1997年11月,顶级搜索引擎声称索引了两百万(WebCrawler)至十亿篇网络文件(来自Search Engine Watch)。可以预见到2000年,一个全面的网络索引将会包含一百亿个文件。与此同时,搜索引擎处理的查询量也在爆增。1994年3月和4月, World Wide Web Worm平均每天要接受1500次查询。1997年11月,Altavista声称它每天要处理大约两亿次查询。随着网络用户和查询搜索引擎的自动系统数量的增长,估计到2000年顶级的搜索引擎每

6、天要处理上十亿次的查询。我们的系统的目标就是要着手解决这些问题,无论是质量还是在将搜索引擎技术扩展到如此程度中引入的可扩展性的概念。 1.2 Google:与网络同步 要搭建一个哪怕是能和现今网络规模相适应的搜索引擎都会遇到很多挑战。要想搜集网络文件并保持更新就需要快速的抓取技术。还要有效地利用磁盘空间索引和部分文件本身。索引系统必须能高效地处理上百G的数据。还要迅速地处理每秒钟成百上千次的查询。 随着网络的不断增长,这项工作变得越来越困难了。但是,硬件性能和费用问题的改善也部分地削减了困难度。然而在这个进度中还有几个明显的例外,比如磁盘的寻道时间和操作系统的健壮性。在Google的设计中,我

7、们同时考虑到了网络的增长速度和技术的变更。Google的设计使之能够很好地扩展到能处理极大量的数据。它有效地利用了存储空间来储存索引文件。优化的数据结构使之能够支持快速高效的数据访问(见4.2节)。进一步地,我们希望建立索引和存储文本文件或HTML文档的代价会相对于它们实际的大小而不断减小。对于象Google这样的集中式系统来说,这些措施换来的是可观的可扩展性。 1.3 设计目标 1.3.1 提高搜索质量 我们的首要目标是提高网络搜索引擎的质量。在1994年,有些人认为通过全搜索索引是有可能很容易找到任何东西的。根据Best of The Web 1994Navigators, “最好的导航服

8、务可以在网络中找到几乎任何东西(只要输入所有的数据)。”然而,1997的网络就大不一样了。任何最近使用过搜索引擎的人都能轻易地证实索引地完整性并不是影响搜索结果质量的唯一因子。用户们真正感兴趣的搜索结果经常被“垃圾结果”所湮没。事实上,到1997年11月为止,在四个顶级的商业搜索引擎中只有一个能搜到自己(在搜索自己名字时前十位结果中返回自己的搜索页面)。引发这个问题的一个主要原因就是索引中文件的数量已经增长了好几个数量级,相应地,用户能查阅的文档数却没有增加。人们仍然只愿意看看前几十个结果。因此,当集合的大小增加时,我们需要具有高精度(比如前几十个结果中的相关文档的数量)的工具。当然,我们希望

9、我们所说的“相关”只是指恰恰最好的文档,因为很可能还有几万个稍有点相关的文档。即使与招回率(系统能够返回的相关文档的总数)的代价相比,高精度仍然是很重要的。近来对利用更多的超文本信息来改进搜索和其它应用软件的方法还是相当乐观的Marchiori 97Spertus 97Weiss 96Kleinberg 98。特别是链接结构Page 98和链接文本能够为相关性判断和质量过滤提供大量的信息。Google同时利用了链接结构和链接文本(见2.1节和2.2节)。 1.3.2 搜索引擎的学术研究 除了迅猛的发展,网络也随着时间增长变得越来越商业化了。1993年的时候,只有1.5的网络服务器是在.com域

10、名下的。到了1997年,这个数字增长到超过60 。同时,搜索引擎也从学术领域移民到了商业领域中。到目前为止,大多数搜索引擎的开发工作都是在公司中进行的,几乎不公开任何技术细节。这就使得搜索技术很大程度上被关在暗箱中操作,并且面向广告了。我们有强烈的愿望利用Google来推动学术领域中发展和理解。 另一个设计目标是建立一个给相当数量的人们实际使用的系统。用户的使用对于我们来说十分重要,因为我们认为大多数有意义的研究都离不开现代网络中海量数据的支撑。例如,每天都会有几千万的查询量。然而因为这些数据被认为是具有商业价值的,所以我们很难得到这些数据。 我们最后的设计目标就是建立一个能够支持基于海量网络

11、数据的新研究活动的体系结构。为了提供给新研究的使用,Google以压缩形式存储了所有它抓取的实际文档。我们设计Google的一个主要目标在于建立一个环境使得其它的研究人员能够快速进入这个领域、处理网络上海量数据、产生一般很难产生的有意义的成果。系统建立后的不长的时间里,已经有不少论文用到了Google生成的数据库,还有很多正在进行当中。我们的另外一个目标是建立一个空间站实验室似的环境,在这里研究人员甚至学生都能利用我们的海量网络数据进行设计和做一些有意义的实验。 2 系统特性 Google搜索引擎有两个重要的特性,有助于产生高精度结果。第一,它利用网络的链接结构计算每个网页的排名值。这个排名值

12、被称为PageRank,在Page 98中有详细的介绍。第二,Google利用链接来改进搜索结果。 2.1 PageRank:给网络带来秩序 网络的引用(链接)图是一件很重要的资源,却在很大程度上被现存的网络搜索引擎忽视了。我们已经建立了一个包含了5亿1千8百万个这样的超链接的图,一个有重要意义的对整体的采样。通过这些图可以迅速地计算一个网页的“PageRank”,一个对引用重要性的客观评价,很好地与人们对重要度的主观概念保持了一致性。由于这种一致性,PageRank是一种对网络关键词搜索结果评级的绝好的方法。对于大多数流行的主题,在对网页标题简单的文本匹配中 PageRank对结果评级的表现

13、棒极了(演示可以在上得到)。在Google主系统的全文搜索中, PageRank也帮了不少忙。 2.1.1 计算PageRank 在学术文献中的引用理论已经被应用到网络中了,大部分是通过对指向某页的引用或链接计数。这的确对一个网页的重要性或质量给出了一些近似值。PageRank扩展了这种思想,对指向网页的链接并非平等地计数,并且将网页上的链接数标准化。PageRank的定义如下: 我们假设有网页T1Tn指向(例如:引用)网页A。系数d是值在0 到1之间的抑制因子。我们通常将它设为0.85。关于系数d的更多细节在下一节。同时C(A)定义为从网页A指出的链接数

14、。网页A的PageRank值如下: PR(A) = (1 - d) + d (PR(T1) / C(T1) + + PR(Tn) / C(Tn) 注意所有的PageRank在各网页中形成概率分布,所以所有网页的PageRank的和会是1。 PageRank或PR(A)可用简单的迭代算法来计算,对应于规格化后的网络链接矩阵的主特征向量。并且,在一个中等规模的工作站上计算2千6百万网络页面的PageRank只需要几个小时。还有很多细节问题,但是超出了本文的论述范围。 2.1.2 直观理由 PageRank可以被认为是用户行为的模型。我们假设假设有一个“随机冲浪者”,给他一个随机的网页,他不停地点击

15、链接,从不点“后退”,但是最终会厌烦,然后从另外一个随机网页上再开始。这个随机冲浪者访问某一网页的概率就是它的PageRank。而抑制因子d就是随机冲浪者在每一个页面上因厌烦而请求另一随机页面的概率。一个重要的变体是只将抑制因子d加在一个单一的页面上,或者一组页面上。这样就带来了可定制性,并且使得故意误导系统而得到较高的排名的行为变得几乎不可能。我们还有许多其它扩展的PageRank算法,见Page 98。 另一个直观理由是如果一个网页有很多网页指向它,或者有一些PageRank值很高的页面指向它,这个网页的PageRank值就会很高。直觉上来讲,一个被网络上到处引用的页面应该是值得一看的。并

16、且,有一些可能只有一个比如从Yahoo!主页上来的引用的网页同样也是只得一看的。如果一个网页质量不高,或者就是个死链,Yahoo!主页是不太可能会链接它的。PageRank通过在网络链接结构中递归地传播权重而同时处理了这两个因素和两者之间的所有情况。 2.2 链接文本 我们的搜索引擎对链接文本进行了特殊处理。大多数搜索引擎将一个链接上的文本和链接所在的页面关联起来。更进一步地,我们把它和这个链接所指向的网页关联起来。这样做有两点好处。首先,链接文本往往能比网页本身提供更精确的描述。其次,对于基于文本的搜索引擎不能索引的文档,比如图像、程序、数据库等,链接文字是有必要存在的。这样就有可能返回一些

17、并没有实际抓取过的页面。注意,没有抓取过的页面会引起问题,因为在返回给用户之前它们并没有被检查过可用性。在这种情况下,搜索引擎甚至会返回一个并不实际存在的页面,但是有一个超链接指向它。但是,我们可以把结果分类,所以这个特殊问题很少发生。 这种将链接文字传递到它所指向的页面的思想在World Wide Web WormMcBryan 94中就实现了,就是由于它能有助于搜索非文本数据,而且能够在少量下载文档的情况的下增加搜索覆盖面。我们使用链接传递的主要原因是链接文字能够提供高质量的结果。有效地利用链接文字是有技术困难的,因为要处理的数据量十分巨大。在我们目前抓取的2千4百万个页面中,我们索引了超

18、过2亿5千9百万个链接文本。 2.3 其它特性 除了PageRank和链接文本的使用,Google还有不少其它的特性。首先,对于所有的点击都有位置信息,这样就能在搜索中充分应用邻近性。其次, Google注意到了一些可视的表达细节,比如词语的字号。大号或者黑体字的权重要高于其它的字。再次,在仓库中能够获取原始完整的HTML页面。 3 相关工作 网络中的搜索引擎有一个简短的历史。World Wide Web Worm(WWWW)McBryan 94是最早的搜索引擎之一。紧跟着又有许多其它的学术搜索引擎,它们有很多现在已经是上市的公司了。相比网络的增长而言对于搜索引擎的重要性此前只有少量关于现在搜

19、索引擎的文档Pinkerton 94。Michael Mauldin(Lycos Inc的首席科学家)Mauldin说,“各式各样的服务(包括Lycos)都紧密地关注这些数据库的细节”。不过,在搜索引擎的一些特殊细节上也有一定量的工作。尤其具有代表性的工作有,通过再处理现存的一些商业搜索引擎的结果再得到结果,或者创建小型“个人化的”搜索引擎。最后,在信息检索系统方面的研究也不少,尤其是在精确控制集合方面。在接下来的两节里,我们会讨论在一些需要扩展的的领域,以便更好地在网络上工作。 3.1 信息检索 在信息检索系统领域的工作可以追述到几年前,并且发展迅速Witten 94。但是多数在信息检索系统

20、上的研究都是基于小规模同构的精确控制集合的,比如科学论文或者关于某一主题的新闻故事的集合。当然,信息检索的主要测评组织:Text Retrieval ConferenceTREC 96使用了一个相当小的精确控制集合作为它们的基准。相比“极大型公司”才20G的基准,我们爬行了2千4百万总共147G的网页。在TREC上工作良好的东西,拿到网络中来往往就得不到好的结果。比如,标准向量空间模型应该返回与查询词最相近的文档,它假设查询词和文档都是由它们的词频所定义的向量。在网络上,这种策略往往返回在查询词后加几个词的很短的文档。比如,我们在一个主要的搜索引擎上看到,查询“Bill Clinton”,返回

21、了一个只包含“Bill Clinton Sucks”的页面和查询“Bill Clinton”得到的图片。有人争辩说,在网络上用户应该更精确地指定他们想要什么并在查询的时候多用些词。我们强烈地反对这种立场,如果一个用户提出象“Bill Clinton”这样的查询,他应该得到理想的结果,因为在这个主题上存在大量高质量的信息。因为有这样的事例,我们认为标准的信息检索工作需要发展以便高效地处理网络任务。 3.2 网络与精确控制集合的区别 网络是一个完全无控制的异构文档的大型集合。网络中的文档内部极具变化性,外部的元信息也是如此。例如,文档内部的语言(无论是人类还是编程语言)、词汇(电子邮件地址、链接、

22、邮编、电话号码、产品编号等)、格式的类型(文本、HTML、PDF、图像、声音等),甚至有些是机器产生的(日志文件或者数据库的输出)。另一方面,我们将外部元信息定义为能够从一个文档中推出的信息,但是它本身并不包括在文档中。外部元信息的例子如,资料来源的声誉、更新频率、质量、流行度或者访问量,还有引用。不仅外部元信息资料可能的来源各式各样,被评价的东西本身也是极为多样的。比如一个重要的主页比如Yahoo!目前每天要接受上万次的页面浏览,与此相比一篇晦涩的历史文章可能十年才会被浏览一次。很显然,搜索引擎对这两类信息的处理是大不相同的。 网络与精确控制集合间的另一个巨大的区别在于,在网络上实际上没有对

23、什么人可以上传加任何限制。这种发布任何信息的灵活性和搜索引擎对路由传输的巨大影响再加上一些公司为牟取利益而故意操纵搜索引擎一起,已经形成了严重的问题。这些在传统搜索引擎中没有被提出来的问题已经接近信息检索系统了。另外,有意思的是元数据效应对网络搜索引擎几乎是失败的,因为任何没有向用户直接陈述的页面文本都会被指责为是在操纵搜索引擎。还存在有大量的公司专门琢磨操纵搜索引擎以牟取利益。 4 系统剖析 首先,我们对体系结构做一个整体的讨论。然后,会对深层次的重要的数据结构做一些描述。最后,我们会逐个深刻解释主要的应用程序:爬行器,索引器和搜索器。 4.1 Google体系结构概述 在这一节里,我们会对

24、图1中的整个系统是如何工作的做一个整体上的概述。接下来的章节会讨论本节没有涉及的应用程序和数据结构。Google的绝大部分为了保证效率的原因是用C或者C+程序实现的,可以在Solaris或者Linux下运行。 【图1:Google的整体结构】在Google中,网络爬行(网页的下载)是由很多分布的爬行器来做的。由一个URL服务器来向爬行器发送URL列表。被抓取下来的网页就被送到存储服务器上。存储服务器再把网页压缩并存储在仓库里。每一篇网页都有唯一一个与之相关联的ID号,称作docID,每当有一个新的URL被分析出来的时候都会被赋予一个docID。索引函数由索引器和整理器在执行。索引器会执行若干个

25、函数。它会读取仓库、解压文档并分析它们。每一篇文档都被转化为词汇出现情况的集合,被称为hits。hits记录了词汇、在文档中的位置、对字号的估计和大小写。索引器将这些hits分发到一些“桶”的集合中,创建部分整理好的前向索引。索引器还要执行另一个重要的函数。它要分析出每一篇网页中的链接然后将关于它们的重要信息存储在一个链接文本文件中。这个文件包含了足够的信息,可以判断每个链接分别是从哪里到哪里,还有链接上的文本。 URL分解器读取链接文件,并将其中相URL转化为绝对URL,然后转化成docID。它将链接文本放入前向索引中,将链接所指向的docID与之关联起来。它还要生成一个docID对偶的链接

26、数据库。链接数据库是用来给所有文档计算PageRank的。 整理器获得以docID整理过的(这是一种简化,见4.2.5节)桶,再根据docID进行整理,生成倒排索引。为了使这个操作几乎不需要临时空间,这一步要在一个特定的地方执行。整理器在倒排索引中产生wordID和偏移量的列表。一个叫DumpingLexicon的程序将这个列表和由索引器生成的词典比较构造出搜索器所用的新词典。搜索器由网络服务器运行,利用由DumpingLexicon构造的词典和倒排索引还有PageRank来回应查询。 4.2 主要的数据结构 Google的数据结构是经过优化的,所以能在少量开销的条件下爬行、索引、搜索大规模的

27、文档集。虽然几年来CPU和块输入输出的速率都由显著的提高,但是一次磁盘寻道仍然需要10毫秒来完成。Google的设计尽可能地避免了磁盘寻道开销,这就对数据结构的设计产生了相当大的影响。 4.2.1 BigFiles BigFiles是跨越多个文件系统的虚拟文件,可由64位整数寻址。在多文件系统之间空间分配是自动处理的。BigFiles包还可以处理文件描述符的空间分配和回收,因为操作系统提供的功能不够我们用的。BigFiles还支持基本的压缩选项。 4.2.2 仓库 仓库包含了所有的网页的HTML全文。每一页都用zlib(见RFC1950)压缩。对压缩技术的选择是在压缩速度和压缩率之间的权衡。我

28、们选择了 zlib的速度而没有选择bzip对压缩率的重要改进。和bzip大约4:1的压缩率相比zlib的压缩比为3:1。在仓库中,文档一个接一个地存储,用 docID、长度和URL做为前缀,如图2。访问仓库不需要其它的数据结构了。这样有助于保持数据的一致性并且能显著简化开发工作;我们可以通过仅仓库和一个爬行器错误文件来重建所有其它的数据结构。 【图2:仓库数据结构】4.2.3 文档索引 文档索引保留了每个文档的信息。它是一个定宽ISAM(Index sequential access mode)索引,以docID排序。其中每一项中的存储的信息包括了当前文档状态、指向仓库的指针、文档的校验和还有

29、各种统计数据。如果一篇网页被抓取过,那它同时也会包括一个指针,指向一个变长的含有它的URL和标题的文件,这个文件被成为docinfo。否则这个指针就指向一个只含有URL的URL 列表。这样的设计选择是因为我们希望有一个简洁的数据结构,并且能够在一次查询中只访问一次磁盘就得到一条记录。 另外还有一个文件用来将URL转换为docID。文件中是URL的校验和与对应docID的列表,并且以校验和排序。要找到某个特定的URL的 docID,先计算出URL的校验和,再在校验和文件中做二分查找就能找到它的docID了。通过于这个文件的合并可以将URL批量转换成docID。这种技术被URL分解器用来将URL转

30、换成docID。而批量转换的改进是至关重要的,因为否则我们就必须对每一个链接进行一次磁盘寻道,这意味着如果只有一个磁盘,要处理我们的3亿2千2百万个链接的数据集会花掉一个月的时间。 4.2.4 词典 词典有几种不同的形式。与以前的系统相比一个重要的变化是词典可以被放在内存中而不会在内存上花费很多。在现在的实现中我们可以将词典放在一台256M内存的机器上。目前的词典含有1千4百万词汇(虽然有一些罕见的词汇没有被放进去)。它的实现分两部分一个词汇的列表(连接在一起但是用null分隔)和一个指针的散列表。对不同的函数,词汇列表有一些辅助信息,完整的讨论已经超出了本文的范围。 4.2.5 Hit列表

31、一个hit列表对应于一个特定的词汇在一个特定的文档中出现情况,包括了位置、字号、大小写等信息。Hit列表在前向索引和倒排索引中占了大部分空间。因此,使它们的表现形式尽量有效率很重要。我们考虑了几种可选的方案来对位置、字号和大小写信息进行编码简单编码(用三个整数),紧凑编码(用手工优化的比特分配),和哈夫曼编码。最后我们选择了手工优化的紧凑编码,因为它占用的空间远小于简单编码,而对比特的操作也远少于哈夫曼编码。Hit的细节见图 3。 【图3:前向索引、倒排索引和词典】我们的紧凑编码每个hit使用两个字节。有两种类型的hit:特别hit与普通hit。特别hit包括了出现在URL、标题、链接文本或者

32、元标签中的 hit。普通hit指所有其它的hit。普通hit包括了一个大小写位、字号、和12比特的词汇在文档中的位置(位置超过4095的都被标为4096)。与文档其它部分的相对字号使用3个比特表示(实际上只使用了7个值,因为111表示特别hit)。特别hit由一个大小写位、字号字段被置为7标志特别 hit、4比特编码用来表示特别hit的类型、和8比特的位置组成。对于链接hit,8比特的位置字段被分为4比特表示在链接中的位置,另外4比特用作对链接出现文档docID的散列。只要对于一个特定词汇没有那么多的链接,我们就可以进行一些有限的短语查询。为了能对位置字段和docID 的散列字段有更好的解决办

33、法,我们考虑改进链接hit的存储方式。我们使用的相对于本文档其余部分的相对字号,因为在搜索的时候,你不会因为一篇文档的字号比另一篇大就特殊对它进行特殊排序。 hit列表的长度存储hit本身的前面。为了节省空间,hit列表的长度和前向索引中的wordID、倒排索引中的docID结合在一起。这就限制它各自只占8到5个比特(用点技巧可以从wordID中借8个比特)。如果长度超过了这些比特所能表示的范围,就有使用一个溢出码,其后的两个字节是实际的长度。 4.2.6 前向索引 前向索引实际上已经部分地排好序了。它被存储在一定数量的桶里(我们用了64个)。每个桶里维护这一定范围的wordID。如果一篇文档

34、的的词汇落在了某个桶里,这篇文档的docID也被存储在桶里,后跟wordID的列表和与这些词对应的hit 列表。这种方案因为重复存储docID而需要更多的存储空间,但是在由于桶很多所以区别不大,且在整理器进行最后的索引操作的时候能够节省相当多的时间和降低编码复杂度。更进一步地,我们并非存储wordID本身,而是存储该wordID与所在桶最小wordID的相对位置。这样,我们就可以只将24比特用于未排序的桶里的wordID,留下8比特给hit列表的长度字段。 4.2.7 倒排索引 倒排索引包含了和前向索引相同的桶,但是倒排索引已经被整理器处理过了。对于每一个有效的wordID,词典都包含了一个指

35、向该词所在桶里的指针。它同时指向一个docID的doc列表和与之对应的hit列表。这个doc列表表示了一个词汇在所有文档中的出现情况。 一个重要的问题是在doc列表中docID应该以什么顺序存储。一个简单的解决办法是以docID排序。这样可以方便合并不同的doc列表从而支持多词查询。另一个选择是按照词汇在每篇文档中的出现情况排序存储。这样做使得回应单一词汇查询显得轻易而举了,还使对多词查询的结果都接近起始处。但是,这样使合并要麻烦得多。同时,这也让开发工作更困难,因为每当要改动排序函数都要重建索引。我们的选择是两者的折衷,同时维护两组倒排桶一组用来存储含有标题或者链接文字的hit列表,另一个存

36、储所有的hit列表。这样,我们先在检查第一组桶,如果这些桶里没有足够的匹配我们就查找大桶。 4.3 爬行网络 运行一个网络爬虫程序是一项具有挑战性的任务。这里面有棘手的现象和可靠性问题,甚至还有社会问题。爬虫是最脆弱的程序,因为它涉及到与上百台服务器交互还有各种不在系统控制范围内的域名服务器。 为了覆盖上亿篇网页,Google有一个快速的分布式爬虫系统。一台URL服务器给数台(我们一般运行三台)爬虫提供URL。URL服务器和爬虫都是用 Python实现的。每台爬虫一般同时维护300左右个的连接。只有这样才能使网页抓取速度有足够快的速度。在峰值速度下,四个爬虫的系统每秒钟能爬行上百篇网页。这就是

37、说数据率在每秒600K左右。DNS解析是一个主要的性能瓶颈。每个爬虫都自己维护一个DNS缓存,这样就不必在爬取每篇文档前都去解析 DNS。上百个连接中的每一个都可能处于几种不同的状态中:DNS解析、连接主机、发送请求和接受回应。这些因素使得爬虫程序成为系统中的一个复杂的组成部分。它使用异步IO来处理事件,还要有许多队列来转换页面抓取的状态。 似乎要运行一个连接超过50万服务器、产生上千万条日志的爬虫也会召来同样数量的Email和电话投诉。因为线上的认识太多,总有人会不知道爬虫是什么东西。几乎每天我们都会收到象这样的Email,“哇,你在我主页上看了这么多东西。你觉得我的网页怎么样?”也有一些人

38、不知道机器人避免协议,还认为在网页上写上“本页版权所有,请勿索引”就可以让自己的网页不被索引到,不用说,爬虫程序很难明白这是什么意思。同时,由于涉及的数据太多,还会发生一些意想不到的事情。比如,我们的系统会去爬取一场网络游戏。结果使得在他们的游戏中产生不少垃圾消息!看起来这是个很容易解决的问题。但是这个问题在我们下载了上千万篇页面的时候才显现出来。由于网页和服务器经常变化,实际上,如果不在因特网上大面积地运行,是很难测试爬虫程序的。有些莫名其妙的问题还会不定地出现在整个网络地某一篇网页上引起爬虫的崩溃,甚至引起一些不可预见的错误行为。大面积访问因特网的系统必须被设计得非常健壮,并且要仔细测试。

39、因为象爬虫这样的大型的复杂系统不定会出什么问题,所以还需要花些重要资源来阅读这些Email,并在问题发生的时候解决它。 4.4 索引网络 分析任何被设计为运行在整个网络上的分析器都必须能够处理大量可能出现的错误。范围从HTML标签的打字错误到标签之间几K字节的零、非ASCII码字符、上百层的HTML标签嵌套,还有些超出任何人想象的各式各样的和解决办法一样多的错误会出现。为了得到最快速度,我们没有采用YACC生成上下文无关文法分析器,而采用了flex生成的词汇分析器,它只需要配有自己的堆栈。开发这样一个快速并且健壮的的分析器需要极大的工作量。 将文档索引到桶中在分析完每一篇文档后,它都被编码放进

40、一些桶中。每个词都被一个内存中的散列表词典转化成wordID。有新词加入词典散列表时,会记录到日志文件中。一旦词汇都被转化为wordID后,它们在当前文档中的出现情况就会被转换成hit列表并被写入到正排桶中。索引阶段并行性的主要困难是词典需要被共享。我们没有共享词典,而是致力于对所有不在基础词典中的额外词汇写到日志中,我们的基础词典中有1千4百万条词汇。这样多个索引器就能并行运行,那个小日志文件可以由最后一个索引器来处理。 整理为了产生倒排索引,整理器将每个正排桶按照wordID排序并分别为标题、链接、和全问生成倒排桶。一次只有一个桶被处理,所以它需要的临时存储空间很少。另外,我们将排序步骤并

41、行化,我们只要简单的运行多个整理器就能尽可能地用上所有的机器,这样就能同时处理多个桶。因为桶太大没法装到内存里去,所以整理器进一步地将它们细分为一些基于wordID和docID能放进内存里的篮筐。然后整理器将每个篮筐装载到内存里来,将它排序,把其中内容写入到短倒排桶和全文倒排桶里去。 4.5 搜索 搜索的目的是高效地提供高质量的结果。很多商业搜索引擎似乎在效率方面有不小的进步。因此我们在研究中更多的关注质量问题,虽然我们相信我们的解决方案只需再稍微努力就能达到商业标准。Google查询评价的过程如表4。 【表4:Google查询评价】在响应时间上加上限制,一旦找到一定数目(目前是4万)的匹配文

42、档,搜索器自动跳到图4中第8步。这意味着有可能会返回次优化的结果。我们现在正在研究新的方法解决这个问题。在以前,我们按照PageRank值将hit排序,似乎能够改善这种情况。 【图4:Google查询结果的采样】4.5.1 排序系统 Google比一般的搜索引擎对网络文档维护了更多的信息。每一个hit列表包含了位置、字体和大小写信息。另外,我们还考虑了链接文字里的hit和文档的PageRank的影响。在排序中综合考虑这些信息是很困难的。我们对排序函数设计是没有那个因素的影响过大。首先考虑最简单的情况单一词汇的查询。为了给单一词汇查询中的一篇文档评级,Google先在这篇文档的hit列表找到中那

43、个词。Google假设每一个hit都属于某种类型(标题、链接、URL、大字号普通文本、小字号普通文本),每种类型都有自己的权重。这些权重构成了一个由类型索引的向量。Google将hit列表中每种类型的hit计数。然后将计数值转换为计数权重。计数权重先随着计数值线性增长但是很快就停止增长了,计数超过某个值时就与计数没有关系了。我们将计数权重与类型权重向量的内积作为该文档的IR得分。最后,由结合IR和分和PageRank给出该文档最后的评级。 对于多词查询,情况就复杂多了。多个hit列表必须同时扫描,才能使同一文档中相邻的hit的权值比离得远的hit的权值高。分布在不同hit列表中的 hit分开匹

44、配,以便相邻的hit一起匹配。对于每个匹配hit集,都要计算一个邻近度。这个邻近度基于hit在文档(或者链接)中的距离计算,但是被分为十个等级,范围从短语匹配到“毫不相干”。我们不仅对每种类型的hit计数,而且还对每种类型和邻近度计数。计数被转换成计数权重,然后我们取计数权重和类型邻近度权重的内积计算IR得分。所有这些数和矩阵都可以在一种特殊的调试模式下被显示出来。这些显示输出对排序系统的开发工作大有帮助。 4.5.2 反馈 排序函数有许多象类型权重和类型近似值权重这样的参数。从这些参数重得出正确的结果就像在暗箱操作。为了达到目的,我们的搜索引擎重带有用户反馈机制。可信的用户可以对所有返回结果

45、进行有选择的评价。反馈信息被保存下来。然后当我们修改排序函数的时候就能看出这种改变在以前排好序的搜索上的影响。虽然远不是那么完美,但是这能让我们了解排序函数中的改变会如何影响结果。 5 结果和性能 一个搜索引擎最重要的评价标准就是查询结果的质量。虽然完整的用户评价已经超出了本问的范围,但以我们的经验看来在多数查询上Google的结果比一些主要的商业搜索引擎要好。举例说明PageRank、链接文本和近似值的应用,图5是在Google中一次搜索“bill clinton”得到的结果。这些结果说明了Google的一些特点。结果是由服务器聚集起来的。这样对在切换结果集的时候很有帮助。相当多数量的结果来

46、自域,这正是对这样的搜索希望得到的结果。现在多数主要的商业搜索引擎都不会返回任何来自的结果,这不太对。注意第一个结果没有标题。这是因为我们没有抓取过它。Google是从链接文本来判断这对查询是一个好结果的。相似地,第十五个结果也是一个不能抓取的Email地址。它也是由链接文本产生的结果。 所有这些结果的质量都是相当高的,最后检查,没有一个是死链。这很大程度上是因为它们的PageRank值都很高。PageRank值由条中的红色部分的百分比表示。最后,没有一条只有bill没有clinton的结果,也没有一条只有clinton没有bill 的结

47、果。这是因为我们十分重视词汇出现的接近度。当然,一个真正的搜索引擎质量测试需要由广泛的用户学习或者结果分析,这里我们的篇幅有限。相反,请读者们自己取亲身体验Google:/。 5.1 存储需求 除了搜索质量以外,Google的设计使之能够随着网络的增长而有效地调整成本。这其中就包括了存储效率方面的问题。表1列出了一些统计结果和 Google的存储需求。由于应用了压缩计数,仓库的总大小大约是53G,是实际要存网页大小的三分之一多一点。按照当前的磁盘价格来看,仓库成为了成本低廉,有用的数据源。更重要的是,搜索引擎所需全部数据的总大小也是差不多的,大

48、约55G。而且,多数查询只需要用到短倒排索引。有了文件索引优化的编码和压缩方式,一个高质量的搜索引擎就能在一台7G磁盘的新PC上运行了。 【表1】5.2 系统性能 有效地抓取和索引对搜索引擎来说是很重要的。这样信息才能保持更新,系统的变更也能被较快测试出来。对于Google,主要的操作是爬虫、索引和整理。要计算爬虫运行一次要多长时间是很困难的,因为有可能会因为磁盘空间不够、域名服务器崩溃或不知道什么原因而导致系统停止。要下载2千6百万的页面(包括错误页面),总共需要大约9天的时间。然而,一旦系统运行流畅了,速度会明显加快,只用63个小时就下载完剩下的1千1百万页面,平均每天4百万篇页面或者每秒

49、48.5篇页面。索引器和爬虫器是自动运行的。索引器比爬虫器运行速度要快一些。这是因为我们在优化索引器上花了大量的时间,保证这不会成为系统的瓶颈。这些优化包括了文档索引的块更新和本地磁盘上重要数据结构的组织存放。索引器每秒中处理大约54篇页面。整理器可以完全并行运行;用4台机器,整个过程整理器需要用掉24小时。 5.3 搜索性能 现在我们研究的主要侧重点不在对搜索性能的改进上。当先版本的Google对大多数查询请求会在1到10秒内给出回应。这些时间主要被花在了磁盘IO和 NFS上(因为磁盘是分布在多台机器上的)。并且,Google也没有任何这方面的优化,比如,查询缓存、对常用词的二级索引,也没有

50、其它的什么常见的优化。我们倾向于通过分布式、硬件、软件和算法的改进来提高Google的速度。我们的目标是每秒钟处理几百个查询。表2有一些对当前版本Google响应时间的采样。我们对它们进行了重复搜索,这样就能看到IO缓存对查询的加速。 【表2:搜索时间】6 结论 Google被设计成可扩展的搜索引擎。它的主要目标是在万维网飞速增长的情况下提供高质量的搜索结果。Google使用了一些技术来提高搜索质量,包括 PageRank、链接文本和位置信息等。总之,Google有一个完整的体系结构来搜集网页、对它们建立索引、在它们的基础上提供搜索查询服务。 6.1 未来的工作 一个大型的网络搜索引擎是一个复杂的系统,还有很多工作需要做。我们

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论