互联网搜索引擎的索引和一本书的索引有着相同的工作原理。书“页”现在成了万维网上的网页,而搜索引擎则给互联网上的每个网页分配了一个不同的页码。(是的,互联网上虽然有很多网页——最新的数据显示有成百上千亿个——但计算机很擅长处理大数字。)上图给出了一个会让整个过程更具体的例子。想象万维网只由上面显示的3个短网页组成,它们分别分配到了页码1、2和3。
计算机可以为这三个网页创建一个索引:首先要为出现在任一页面上的所有单词创建一个列表,然后按字母表顺序整理这张列表。我们可以将结果称为单词表(word list)——在这个例子中是“a、cat、dog、mat、on、sat、stood、the、while”。然后计算机会一个单词一个单词地搜遍所有页面。计算机会标注每个单词所在的页码,然后再标注单词表中下一个单词的位置。最终结果显示在上图中。比如,你可以立即看到单词“cat”出现在第1页和第3页,却不在第2页。而单词“while”只出现在第3页。
通过这种简单方法,搜索引擎就已经能回答许多简单的查询。比如,假设你输入查询词“cat”,搜索引擎能很快跳转到单词表中的“cat”项。(因为字母表是按字母排序的,计算机能很快找到任何项,就像我们可以很快找到词典中的一个单词一样。)一旦计算机找到“cat”项,搜索引擎就能给出该项的页面列表——在这个例子中就是第1页和第3页。现代搜索引擎对结果的组织很合理,只摘取了返回页面的少许片段,不过,我们基本上会忽略这样的细节,将精力集中在搜索引擎如何知道页面“符合”用户输入的查询上。
再举另一个非常简单的例子,让我们来检查一下查询“dog”的步骤。在这个例子中,搜索引擎很快会找到“dog”项,并返回页码2和3。如果查询多个单词,如“cat dog”呢?这表示你正在寻找同时包含单词“cat”和“dog”的页面。通过已有的索引,搜索引擎也能很容易查到结果。搜索引擎首先会单独查找这两个单词,找出它们分别在哪些页面中。结果是“cat”在第1页和第3页,“dog”在第2页和第3页。之后,计算机能快速扫描这两个命中列表,寻找同时出现在两个列表中的页码。在这个例子中,第1页和第2页被排除了,但第3页同时出现在两个列表中,因此最终答案就是第3页上的一次单独命中。与之极其相似的一个策略也适用于超过两个单词的查询。比如,查询“cat the sat”会返回第1页和第3页为命中,因为它们是“cat”(1,3)、“the”(1,2,3)和“sat”(1,3)这个列表的通用元素。
就目前来看,搭建一个搜索引擎听起来相当容易。最简单的索引技术似乎运行得很好,即便对多词查询也是如此。不幸的是,这种简单方法完全不能满足现代搜索引擎的需要。出现这种情况的原因有几个,不过现在我们只会关注其中之一:如何做短语查询。短语查询是指寻找一个确切短语的查询,而非凑巧一些单词出现在页面中的某些地方。比如,“cat sat”查询和cat sat查询的意义截然不同。cat sat查询寻找的是在任何位置包含“cat”和“sat”两个单词的页面,不考虑顺序;而“cat sat”查询寻找的是包含单词“cat”之后紧跟单词“sat”的页面。在上面那个由三个网页组成的简单例子中,cat sat查询结果命中第1页和第3页,但“cat sat”查询只返回一次命中,就在第1页。