搜索引擎索引——在世界上最大的草垛中寻针(4)

一个搜索引擎如何才能有效地进行一次短语查询呢?继续说“cat sat”这个例子。第一步和平常的多词查询 cat sat一样,从单词表中获取每个单词出现的网页列表,在这个例子中就是出现在第1页和第3页的“cat”;“sat”也一样,出现在第1页和第3页。不过搜索引擎到这里就卡住了。搜索引擎很确切地知道两个单词同时出现在页面1和页面3上,但没有办法来分辨这些单词是否以正确的顺序紧挨着彼此出现。你也许会想,搜索引擎可以返回查看原网页,看这个短语是否存在。这的确是个可能的解决方案,但效率却非常非常低。这需要遍历每一个可能包含这个短语的网页的全部内容,而且可能有海量这样的网页。记住,我们在这里打交道的是一个只由三个页面组成的极小的例子,真正的搜索引擎必须从数百亿个网页中找出正确的结果。

注意英文单词的双引号。——译者注

词位置把戏

这一问题的解决方案是让现代搜索引擎运行良好的首个、真正精巧的思想:索引应该不单单存储页码,还要存储页面内的位置。这些位置并不神秘:它们只是代表了一个词在页面中的位置。第3个词的位置是3,第29个词的位置是29,依此类推。例子中三个页面组成的数据集如下页图所示,还加上了词位置。图下面的是索引——由存储页码和词位置中得出的结果组成。我们称这种创建索引的方法为“词位置把戏”(word location trick)。举几个例子,以确保大家理解了词位置把戏。索引的第一行是“a3-5.”。这意味着词“a”只在数据集中出现过一次,是第3页的第5个单词。索引中最长的一行是“the 1-1 1-5 2-1 2-5 3-1”。这一行可以让你知道,这个数据集中所有出现单词“the”的具体位置。它在第1页出现过两次(位置1和5),第2页出现过两次(位置1和5),第3页出现过1次(位置1)。

你还记得介绍页内词位置的目的吗?是为了解决如何有效地进行短语查询这个问题。让我们来看看如何用这个新索引做一次短语查询。还是和前面一样,查询短语“cat sat”。第一步和使用旧索引时一样:从索引中提取单个词的位置,“cat”的位置是1-2、3-2,“sat”的位置是1-3、3-7。到这里还好:我们知道短语查询“cat sat”唯一可能的命中就是在第1页和第3页。但与之前一样,我们还不确定相同的短语是否出现在了这些页面中——有可能这两个单词的确出现了,但并不是以正确的顺序彼此相邻。幸运的是,从位置信息中确认这一点很容易。首先从第1页开始。根据索引信息,我们知道“cat”出现在第1页的位置2(这就是1-2的含义)。我们还知道“sat”出现在第1页的位置3(这是1-3的含义)。但如果“cat”在位置2,“sat”在位置3,我们就知道“sat”紧挨着出现在“cat”之后(因为2之后立即就是3)——因此我们寻找的整个短语“cat sat”必定出现在第1页,并从位置2开始。

读书导航