1.基于Robot的搜索过程
Robot使用多线程并发搜索技术,主要完成文档访问代理、路径选择引擎和访问控制引擎。基于Robot的Web页搜索模块主要由URL服务器、爬行器、存储器、URL解析器四大功能部件和资源库、锚库、链接库三大数据资源构成,另外还要借助标引器的辅助功能。具体过程是,有个URL服务器发送要去抓取的URL,爬行器根据URL抓取Web页并送给存储器,存储器压缩Web页并存入数据资源库,然后由标引器分析每个Web页的所有链接并把相关的重要信息存储在Anchors文件中。URL解析器读Anchors文件并解析URL,然后依次转成doc ID,再把Anchor文本变成顺排索引,送入索引库。
(1)URL服务器。URL服务器是整个Web页搜索模块的开始,主要用来管理和维护URL列表。首先由它发送一个新的URL给爬行器,让爬行器去搜索。如果爬行器遇到了不可下载的网页,就会给URL一个返回信息,然后取下一个URL。URL服务器会从文档索引库里不断地取新的URL以供爬行器使用。
(2)爬行器。爬行器是整个搜索模块中最关键的部分,它由好几个分布的爬行器组成,并协同工作。爬行器如遇到HTML的页头有“<head><meta name=”robots“conten=”onindex,nofollow“></head>”标记就不再抓取此页,而是返回一个空值,继续向其他方向爬行,这就有效防止爬行器标引此页及本页的相关链接页。如果网页已经标引过,就从将要爬行的网页队列中移除。Web页文本的繁殖思想是由3W蠕虫来实现的,当它搜索非文本信息时,尽可能少地下载文档,以扩展搜索度,因为非文本信息(如图片等)没有链接会造成爬行的中断。这样,谷歌就可以通过各种策略来解决排序沉没(Rank Sihk)和排序漏出(Rank Loak)等问题。
(3)存储器。存储器把爬行器抓来的Web页进行压缩并存储到数据资源库中。数据资源库包含每一个Web页的全部HTML,所有的网页都用zlib进行压缩。谷歌更注重zlib的压缩速度而不是压缩率,bzip对数据库的压缩率接近4∶1,而zlib为3∶1。这样,谷歌就能把147.8GB的HTML文档压缩成53.5GB的数据存储在库中,在数据资源库中,再对文档进行归类,加上doc ID前缀、文档的长度和URL。文档索引记录着每一个文档的信息,它是一个有固定长度,经doc ID排序的ISAM索引(Index Sequential AccessMode)。
存在每个条目中的信息包括当前文档状态、数据库中的指针、文档校验和以及其他统计信息。如果文档被爬行过,它也包含可变长文件的指针,这个称为docinfo文件,它包含文档的URL和标题。否则,指针指向仅包含URL的URL列表。
(4)分析器。分析器可以视为标引器的一部分,也可以说是标引器的一个辅助功能部分。它分析每个Web页的所有链接并把相关的重要信息存储在anchors文件中,构成一个锚库。每当从Web页分析出一个新的URL时,为每个Web页分配一个称为doc ID的关联ID。这个文件包含足够的信息来决定每个链接何去何从。锚经常提供比Web页本身更精确的页描述。锚可以存在文档,这些文档不能被基于文本的搜索引擎所标引,如图片、程序、数据库。这就为返回那些不能精确爬行的Web页提供了可能。
(5)URL解析器。URL解析器读Anchors文件,并把相对URL转成绝对URL,然后依次转成doc ID。把Anchor文本变成顺排索引,存到文档索引库里,并用Anchor所指向的doc ID进行关联。把URL转换成doc ID的文件,是由UI校验和及相应的doc ID两列组成的一个列表,并以校验和排序。为了找到一个特定URL的doc ID,首先计算URL的校验和,在校验和文件中进行二元查找,以找到相应的doc ID。执行一次批处理,通过合并文件把URL转成doc ID。使用这种批处理模式很关键,要不然就得为每一个链接都做一次查找,假设一个磁盘上有322000000个链接记录,那么这样一个过程需要2个多月的时间。它还产生成对doc ID的链接数据库,以用于计算所有文档的Page Ranks。
2.标引入库过程
标引入库模块由分类器和标引器组成。标引入库模块处理大量的文件和数据,用来构建庞大的数据库,主要涉及数据资源库、词典库、链接库、桶等。桶的结构与内容非常复杂,有关桶的操作是本模块的核心,
(1)分类器。分类器从桶中取出数据,按doc ID进行一级分类,然后按照word ID进行二级分类并产生倒排档索引。分类器产生word ID的列表并把其偏移量写到倒排档索引中。一个称为Dump Lexicon的程序把这个列表和由标引器产生的词典糅和在一起,并为检索器产生一个新的词典。
(2)标引器。标引器有许多函数,它读数据库,解压缩文档然后进行分析。每个文档都被转成一套单词出现频率,称为采样数。采样数记录单词及在文档中出现的位置,字体的大小以及大写信息。标引器把这些采样数分配到一套“桶”中,创建一个部分分类的顺排索引。对于中文,谷歌主要采用了二元切分法,也就是为什么我们输入长于两个汉字的中文,如果不加双引号,谷歌会自动给以切分的原因。
(3)桶。谷歌共有64个桶(Banels),每个桶都存着word ID的归类包括顺排档与倒排档。如果一个文档包含落在某个桶里的词,doc ID和word ID的列表以及相应的命中列表就被记录到桶里。Google存储每一个word ID时,存储的是与所在桶的最小word ID的相对差异,而不是存储实际的word ID。这样,在未排序的桶中用24位存储word ID,留下8位用来存储命中列表的长度。
倒排档索引就像顺排挡一样由系列的桶组成,唯一的不同是被分类器处理过。有个重要的问题是doc ID应当在Doclist中如何排序。一个简单的解决办法是用doc ID进行分类,这允许多词查询而带来的不同Doclist的合并。另外一个办法是按词在每个文档中出现的频率等级进行分类存储,尽管这使得处理单个词的查询变得烦琐,但为多词查询提供了可能。谷歌在这两个方案中选择了折中,使用两套倒排的桶,一套为包括标题和Anchor Hits的命中列表,我们称为短桶,另一套为所有的命中列表,我们称为长桶。
在顺排档索引和倒排档索引中,命中列表占据了大量的空间。命中列表是指词在一篇文档中的出现频率,包括位置、字体和大写信息。谷歌为编码位置、字体和大写考虑了多种编码方案——简单编码、优化压缩编码和哈夫曼编码。由于优化压缩编码对空间的要求比简单编码低,操作过程比哈夫曼编码简单,因此,谷歌最终选择了优化压缩编码。
谷歌用两个字节的压缩编码来记录每次命中,命中类型有两种,即特殊命中与普通命中。特殊命中包括URL的命中率、标题、链接文本和关键标记。普通命中含有所有的信息,包括大写位、字体大小和12位标记词在文档中出现的位置信息等。字体大小用3位来表达文档的其他内容的相对值(仅有7个值可用,因为111是特殊命中的标记)。特殊标记用大写位,字体设成7来表明是一个特殊命中,有4位表示类型,用8位标记位置。为了节省空间,命中列表的长度由顺排挡中的word ID和倒排档中的doc ID决定。分别需要8位与5位。如果长度更长的话,在相应的位里就存着一个溢出编码,接下来的两个字节存储命中列表的实际长度。
(4)词典。词典有几种不同的形式。对早期系统的一个重要改变是根据合理的代价分配内存。该词典包含1400万个词条(有些生僻词没加),由两部分实现,词表和指针的哈希表。词表还有一些辅助信息用以实现其他功能。对于每个有效的word ID,词典包含指向word ID所在桶的指针。它指向doc ID和相应的命中列表的Doclist。Doclist表明该词在所有文档中出现的所有情况。
3.检索过程和网页级别(www.xing528.com)
谷歌用户查询模块主要由查询器和网页级别评定器组成。
(1)查询器。查询器运行在Web服务器上,并用Dump Lexicon产生的词典、倒排档索引和Page Ranks一起来响应查询。首先接受用户输入的检索表达式,进行分析得出各项检索要求,提取检索词并转成word ID,接着到短桶文档列表里进行查词,遍历文档列表直到匹配所有的词条,找到一篇就计算网页等级,短桶查完了,如果没有足够的匹配记录,就去查长桶。查完了所有的文档列表,就对检索结果进行排序并返回前项。
(2)网页级别评定器。网页级别评定器借用了图书文献里的参考文献与引用文献的评价思想,利用链接网页的数量及重要性进行等级评定,而链接网页的重要性由它的链接网页的数量及重要性决定,因此是一种迭代计算。评级函数有许多参数,如类型权重和相关类型权重等。
如果有许多网页指向网页P,那么P就是一个好的网页,从不同域的链接要比同一个域内的链接重要,自然链接可以表明相关重要性。当从网页A链接到网页B时,谷歌就认为“网页A投了网页B一票”,谷歌根据网页的得票数评定其重要性。除了考虑网页得票数(即链接)的纯数量之外,谷歌还要分析投票的网页。“重要”的网页所投出的票就会有更高的权重,也有助于提高其他网页的“重要性”,被引率高就说明该页值得看。
重要的、高质量的网页会获得较高网页级别。谷歌在排列其搜索结果时,总会考虑每个网页的级别。当然,如果不能满足用户的查询要求,网页级别再高对用户来说也毫无意义。因此,谷歌将网页级别与完善的文本匹配技术结合在一起,为用户找到最重要、最有用的网页。谷歌所关注的远不只是关键词在网页上出现的次数,它还对该网页的内容以及该网页所链接的内容进行全面检查,从而确定该网页是否满足用户的查询要求。谷歌在检索引擎里用一个用户反馈机,对信任用户可有选择地评估所有的返回结果,这种反馈被存到数据库里,当修改评级函数时,就能发现对以前评过级的检索所产生的影响。
4.功能检索的实现
通过对谷歌的检索的大量测试,其功能的实现有以下几种方式:
(1)逻辑表达式。谷歌支持的逻辑运算有与、或、非,其形式分别为“and”“or”“-”,对应谷歌高级检索里的“包含全部字词”“包含任何一个字词”“不包含以下字词”。谷歌不支持截词检索,因为截词检索会极大地降低计算机的检索速度。当然谷歌对词的切分技术也并不理想,对西文比较有效,对亚洲语言做得不好。
(2)指定文件类型。谷歌可以指定查找的文件格式,如PDF、DOC、PPT等格式文件。如果某个搜索结果是PDF文件而不是网页,它的标题前面会出现以蓝色字体标明的“PDF”。用户只想查一般网页,而不要PDF文件,只需在搜索关键词后加上“-flietype:pdf”就可以了,而如果只想查PDF文件,则用“filetype:pdf”就可以指定PDF文件了。每一个文档在数据库里都有其文件类型,因此,实现它并不困难。
(3)指定范围。谷歌可以指定网页的范围,如(all)intitle,(all)intext,(all)inurl,(all)inanchor等。网页标题只是对HTML的<title></title>里的内容进行检索,如果title的内容与文章真正的标题不一致,则谷歌没有能力检索出来。
http://www7.scu.edu.au/programme/fullpapers/1921/com1921.htm里的文章真正的标题是“The Anatomy ofa Large-Scale HypertextualWeb Search Engine”,而相关HTML文件里<title></title>的内容却是“The Anatomy of a Search Engine”,因此在Google的输入框里键入“allintitle:‘The Anatomy of a Large-Scale HypertextualWeb Search Engine’”,是查不到该文章的。而对文章内容的检索识别是HTML文件里的<body></body>中的内容。当然还可以限定时间、指定站点等。通过site:www.xxx.xxx.xxx指定站点实现站内搜索是很有用的。
(4)语言问题。谷歌支持66种语言接口,35种语言指定检索,谷歌对语种的判别不是通过URL信息(域名中的国别),主要通过HTML中的Charset和对网页内容部分识别的统计信息来联合判断。其实,好多人还把谷歌当词典来用,我们输入“层次分析法Analysis”指定中文网页就可以检索出层次分析法的英文翻译。
(5)同义词检索。选择“搜索所有网站或搜索所有中文网页”,输入“计算机”,则会把含有“计算机”的网页(不论有没有“计算机”)搜索出来,而在简体中文网页里就不会实现这样的功能,因为谷歌采用Basis Technology的中文简繁体转换技术。
(6)网页目录。谷歌按内容把网页信息分为15个大类,主要是通过词频分布与统计技术,对内容进行识别并用分类器(Sorter)进行归类。
(7)图像搜索。谷歌搜集了3.9亿张图像,对图像的描述信息建了一个很大的数据库。图像检索使用的主要是文件名、图片附近的文本、图片的标题以及从图片中提取的部分内容。
(8)相似结果。谷歌会省略相似的结果,尤其是来自不同站点页内容相同的文章,有时我们在谷歌显示的结果中不能下载相应的文章时,而省略的结果中可能允许下载,这时谷歌的省略功能就带来了不便。判断内容相似主要可能是根据文章题目、文章大小和部分词语统计信息等。当然还有许多特点与使用技巧,在这里不再一一列举。
当我们了解了谷歌的技术实现,就可以理解检索过程中出现的种种现象。针对这些特点再去调整检索策略,这样它返回的结果就不再成千上万了。正常情况下,把检索结果控制在百条左右,是一个专业检索水平的标志,这样的结果对我们也才真正的有意义。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。