互联网搜索引擎工作原理
1. 引言 2. 聚焦万维网 3. 建立索引 4. 建立搜索 5. 未来的搜索引言
有关互联网和它最引人注目的部分——万维网的好消息是,网上有无数网页提供主题极为多样的信息。坏消息是,这些网页大都是由制作者随便命名的,而且几乎全都存储在不知何名的服务器上。当你需要了解特定主题时,您怎么知道应当阅读哪些网页呢?像大多数人一样,您要使用互联网搜索引擎。
互联网搜索引擎是万维网中的特殊站点,专门用来帮助人们查找存储在其他站点上的信息。尽管各种搜索引擎的工作方式有所不同,但它们都要完成三个基本任务:
- 基于关键字来搜索互联网——或其中的一部分。
- 生成一份索引,保存所搜寻的词语,以及相应地址。
- 允许用户在索引中查找词语或词语组合
早期搜索引擎的索引仅包括数十万个的网页或文档,每天受理的查询可能只有一两千次。如今,顶级搜索引擎的索引列表涵盖数亿个网页,每天响应数千万次查询。在本文中,我们将会讲解这些基本任务是如何完成,以及互联网搜索引擎是如何整合信息以帮助我们在网上找到所需内容。
聚焦万维网
大多数人谈及互联网搜索引擎时,实际上指的是万维网搜索引擎。在万维网成为互联网最引人注目的部分之前,早就有搜索引擎帮助人们查找网上信息了。如“gopher”和“Archie”等程序可以生成索引,存储在接入互联网的各个服务器上的文件信息,极大缩短了查找程序和文档的时间。上世纪八十年代末,要想从互联网上获得有价值的信息,就必须知道如何使用 gopher、Archie、Veronica以及其它类似程序。
现在,大多数互联网用户只限于搜索万维网,所以本文只讨论面向网页内容的搜索引擎。
小蜘蛛开始行动
搜索引擎在有能力告诉你文件或文档存储在何处之前,必须先找到它们。为了在现有的数亿网页中找到信息,搜索引擎使用了一种特殊的软件机器人,称之为蜘蛛程序,以此生成在网站上查询到的词语列表。蜘蛛程序建立词语列表的过程被称为爬网。(将互联网的一部分称为网络有些缺点——大量工具以蜘蛛命名就是其一。)为了建立并维护一份有用的词语列表,搜索引擎的蜘蛛程序需要游历大量网页。
蜘蛛程序如何开始其网上旅程?通常起点是那些访问量很大的服务器和热门网页。蜘蛛程序从一个很受欢迎的网站开始,检索网页上的词语并追踪在该网站上找到的每个链接。这样,蜘蛛程序迅速开始了旅行,爬遍网上绝大多数经常访问的网站。
<-- -->为了方便在线用户找到所需网页, 蜘蛛程序提取网页内容并设立搜索关键字。 |
Google的前身是一个学术搜索引擎。在介绍该系统开发过程的论文中,google创始人塞吉·布林(Sergey Brin)和劳伦斯·佩奇(Lawrence Page)举例说明了他们的蜘蛛程序工作得有多快。他们最初开发的系统使用多个蜘蛛程序——通常是三个。每个蜘蛛程序可以同时打开300个链接。最多可以同时使用四个蜘蛛程序,此时该系统每秒可以游历100多个网页,生成大约600KB的数据。
要保证一切都快速运行,意味着必须开发一套系统来为蜘蛛程序提供必要信息。早期Google系统有一个专门为蜘蛛程序提供链接信息的服务器。为了尽可能减少延时,Google没有依靠互联网服务提供商提供的域名服务器(DNS)来将服务器名翻译为网址,而是准备了自己的域名服务器。
当Google的蜘蛛程序访问一个HTML网页时,它会记录以下两种信息:
- 网页中的词语
- 词语所在位置
出现在标题、副标题、元标记以及其他相对重要的位置的词语,会被记录下来,这些词语往往是日后用户搜索时经常使用的。Google蜘蛛程序的设计旨在检索网页中的每一个重要单词(对于英文来说,还要滤掉冠词a、an和the等)。其他蜘蛛程序采用不同的方法。
这些方法通常是为了尽量加快蜘蛛程序的速度,或使用户可以更有效地进行搜索,或二者兼而有之。例如,有些蜘蛛程序会追踪标题、副标题和链接中的词语,以及网页中最常用的100个词和文章前20行中的每一个词。据说Lycos就是使用这种方法爬网的。
其他系统,如比AltaVista,则反其道而行之,检索网页中的每一个字,包括a、an、the以及其他“不重要”的词。人们完善这种方法的干劲从未减弱,而另一些系统则通过其它方法与之抗衡。比如关注网页的不可见部分,即元标记。
元标记
元标记允许网页所有者来设定检索网页的关键字或概念。这很有用,特别是在网页中的词语有多个含义的时候——元标记可以引导搜索引擎在这些词的几种可能含义中选择正确的一项。但是,过分依赖元标记有一个危险:粗心或不负责任的网页所有者会添加一些对应热门话题的元标记,但是与网页实际内容没有任何关系。为了防止此种事情发生,蜘蛛程序会比对元标记和网页内容,剔除那些与网页词语不符的元标记。
上述方法均基于一个假设,也就是网页所有者希望自己的网页被纳入搜索引擎的搜索列表。但有些情况下,网页所有者并不希望它们出现在主流搜索引擎中,或是不希望蜘蛛程序访问网页。比如,假设有一款网页游戏,每当部分页面被显示或者新链接被点击时,游戏就会生成新的动态页面。如果网络蜘蛛程序进入网页,继而开始追踪所有新网页的链接,游戏很可能将这些操作错认为是由一名操作速度极快的玩家执行的,从而失去控制。为了避免此类情况,人们制定了一套拒绝蜘蛛协议。该协议如果嵌入网页开头的元标记部分,就会告诉蜘蛛程序远离该页面——既不要检索网页上的词语,也不要试图追踪网页上的链接。
日搜索次数:美国前五名搜索引擎
- Google:250000000
- Overture:167000000
- Inktomi:80000000
- LookSmart:45000000
- FindWhat:33000000
建立索引
一旦蜘蛛程序完成了网页信息收集工作(我们应当注意,这是一项永远不可能真正完成的工作——网页不断更新的特性意味着蜘蛛程序需要不断爬网),搜索引擎就必须以一种有效方式存储这些信息。要让收集到的数据可供用户使用,涉及两个关键环节:
- 以数据存储信息
- 为信息建立索引方法
在最简单的情况下,搜索引擎只需存储词语和词语所在地址。实际上,这样做会限制搜索引擎的用途,因为这种方式无法区别词语在网页中是被重点使用,还是略一提及,也无法区别词语是使用一次还是多次,或该网页上是否含有其它包括该关键字的网页的链接。换句话说,这样做将无法建立排名表,无法把最有用的网页放在查询结果列表的顶端。
为了获得更多有用信息,大多数搜索引擎存储的信息不仅仅是词语和网址,还可能存储着该字在网页中出现的次数。搜索引擎可能会为每个词条指定一个权重,按照词语出现在文档开头、网页副标题、链接、元标记或标题的顺序,权重依次增大。各商业搜索引擎指定索引中词语权重的公式有所不同。这从一个侧面解释了为什么使用不同搜索引擎来搜索相同关键字,却会产生不同的搜索结果列表,网页排列顺序也有所不同。
如果忽略搜索引擎存储的额外信息的准确组合,将这些数据进行编码可以节省存储空间。比如,最初的Google论文描述了使用两个字节(每个字节8比特)来存储权重信息——单词是不是大写、字号大小、位置以及其他用来为数据确定级别的信息。每个因素大概占据两字节中的两三个比特(8比特=1字节)。因此,大量信息便能以一种压缩率极高的方式存储下来。信息被压缩之后,就可以建立索引了。
索引的唯一目的是尽快找到信息。有好几种方法可以建立索引,但是最有效的方法是建立散列表。通过散列法,运用公式给每个词赋予一个数值。该公式可以把词条平均分配给预定数目的分区。此种数值分配不同于根据字母表分配,这是散列表的有效性的关键所在。
在英语中,以某些字母开头的单词较多,而以其他字母开头的单词较少。例如,您会发现,字典的M部就比X部厚得多。这种不均衡意味着查找一个以“常见”字母开头的单词,要比查找不常见字母开头的单词花费更多时间。散列法平衡了这种区别,并且缩短了查找某一词条的平均时间。它还将索引和实际词条分开。散列表中含有经过散列函数转换生成的数字和一个指向实际数据的指针,(这样)不论什么方式,只要它让实际数据最有效地存储起来,实际数据都可以用这种方式得到分类排序。通过高效的索引和有效的存储方式,即使用户进行了一次复杂的查询,也能迅速查找到结果。
建立搜索
通过索引进行搜索需要用户进行一次查询,并通过搜索引擎提交。查询可以相当简单,最少仅需一个词。建立比较复杂的查询则需要使用布尔运算符来细化和拓展搜索项。
最常见的布尔运算符包括:
- AND(与)——以“AND”相连的若干搜索项必须全部出现在网页或文档中。有些搜索引擎使用运算符号“+”来代替“AND”。
- OR(或)——以“OR”相连的搜索项必须至少有一项出现在网页或文档中。
- NOT(非)——“NOT”之后的搜索项不能出现在网页或文档中。有些搜索引擎使用运算符号“-”来代替“NOT”。
- FOLLOWED BY(跟随)——某一搜索项必须紧随另一搜索项。
- NEAR(临近)——某一搜索项和另一搜索项的距离必须小于特定词数。
- 引号——引号内的词语应被看作一个完整短语,出现在网页或文档中。
这是一个很难的游戏——您需要选择两个完全不相关的词,否则肯定会得到许多网页结果。另一方面,很多完全不相关的单词查询不到任何结果。 如果你发现了一个纯命中,可以把它提交到www.googlewhack.com,他们会把它公布在命中栈(标着您的名字,或者任何您喜欢的称呼)上,大家都可以浏览。 |
未来的搜索
借助布尔运算符定义的搜索是一种文字搜索——搜索引擎按照键入的词语或短语精确搜索。如果键入的单词含有多种意思,就会有问题。例如,“床”(bed),既可以是睡觉的床,也可以是种植花卉的花床,还可以是卡车的货舱或鱼的产卵地。如果您只对其中的一个意思感兴趣,也许就不想查看使用其他意思的网页。您可以尝试去除您不感兴趣的意思来建立文字搜索。但是,如果搜索引擎自己可以解决的话就更好了。
基于概念的搜索是搜索引擎的研究领域之一。有些此类搜索引擎应用统计分析来处理包含您要搜索的单词或短语的网页,以此寻找其它您可能感兴趣的网页。显然,对于基于概念的搜索引擎来说,为每个网页存储的信息要更多,而且每次查询也需要更复杂的处理过程。尽管如此,还是有许多团队致力于改进此类搜索引擎的结果和表现。还有些人转入了另一个研究领域,名为自然语言查询。
自然语言查询的理念是,您可以像询问坐在身边的人那样输入问题——不必使用布尔运算符或者复杂的查询结构。目前最受欢迎的自然语言查询网站是AskJeeves.com,该网站可以将用户的查询解析为关键字,之后再对已建好的网站索引进行搜索。它只能处理简单查询,但在适用于复杂自然语言的搜索引擎的开发领域,竞争相当激烈。