互聯(lián)網(wǎng)搜索引擎的索引和一本書的索引有著相同的工作原理。書“頁”現(xiàn)在成了萬維網(wǎng)上的網(wǎng)頁,而搜索引擎則給互聯(lián)網(wǎng)上的每個網(wǎng)頁分配了一個不同的頁碼。(是的,互聯(lián)網(wǎng)上雖然有很多網(wǎng)頁——最新的數(shù)據(jù)顯示有成百上千億個——但計算機(jī)很擅長處理大數(shù)字。)上圖給出了一個會讓整個過程更具體的例子。想象萬維網(wǎng)只由上面顯示的3個短網(wǎng)頁組成,它們分別分配到了頁碼1、2和3。
計算機(jī)可以為這三個網(wǎng)頁創(chuàng)建一個索引:首先要為出現(xiàn)在任一頁面上的所有單詞創(chuàng)建一個列表,然后按字母表順序整理這張列表。我們可以將結(jié)果稱為單詞表(word list)——在這個例子中是“a、cat、dog、mat、on、sat、stood、the、while”。然后計算機(jī)會一個單詞一個單詞地搜遍所有頁面。計算機(jī)會標(biāo)注每個單詞所在的頁碼,然后再標(biāo)注單詞表中下一個單詞的位置。最終結(jié)果顯示在上圖中。比如,你可以立即看到單詞“cat”出現(xiàn)在第1頁和第3頁,卻不在第2頁。而單詞“while”只出現(xiàn)在第3頁。
通過這種簡單方法,搜索引擎就已經(jīng)能回答許多簡單的查詢。比如,假設(shè)你輸入查詢詞“cat”,搜索引擎能很快跳轉(zhuǎn)到單詞表中的“cat”項。(因為字母表是按字母排序的,計算機(jī)能很快找到任何項,就像我們可以很快找到詞典中的一個單詞一樣。)一旦計算機(jī)找到“cat”項,搜索引擎就能給出該項的頁面列表——在這個例子中就是第1頁和第3頁。現(xiàn)代搜索引擎對結(jié)果的組織很合理,只摘取了返回頁面的少許片段,不過,我們基本上會忽略這樣的細(xì)節(jié),將精力集中在搜索引擎如何知道頁面“符合”用戶輸入的查詢上。
再舉另一個非常簡單的例子,讓我們來檢查一下查詢“dog”的步驟。在這個例子中,搜索引擎很快會找到“dog”項,并返回頁碼2和3。如果查詢多個單詞,如“cat dog”呢?這表示你正在尋找同時包含單詞“cat”和“dog”的頁面。通過已有的索引,搜索引擎也能很容易查到結(jié)果。搜索引擎首先會單獨(dú)查找這兩個單詞,找出它們分別在哪些頁面中。結(jié)果是“cat”在第1頁和第3頁,“dog”在第2頁和第3頁。之后,計算機(jī)能快速掃描這兩個命中列表,尋找同時出現(xiàn)在兩個列表中的頁碼。在這個例子中,第1頁和第2頁被排除了,但第3頁同時出現(xiàn)在兩個列表中,因此最終答案就是第3頁上的一次單獨(dú)命中。與之極其相似的一個策略也適用于超過兩個單詞的查詢。比如,查詢“cat the sat”會返回第1頁和第3頁為命中,因為它們是“cat”(1,3)、“the”(1,2,3)和“sat”(1,3)這個列表的通用元素。
就目前來看,搭建一個搜索引擎聽起來相當(dāng)容易。最簡單的索引技術(shù)似乎運(yùn)行得很好,即便對多詞查詢也是如此。不幸的是,這種簡單方法完全不能滿足現(xiàn)代搜索引擎的需要。出現(xiàn)這種情況的原因有幾個,不過現(xiàn)在我們只會關(guān)注其中之一:如何做短語查詢。短語查詢是指尋找一個確切短語的查詢,而非湊巧一些單詞出現(xiàn)在頁面中的某些地方。比如,“cat sat”查詢和cat sat查詢的意義截然不同。cat sat查詢尋找的是在任何位置包含“cat”和“sat”兩個單詞的頁面,不考慮順序;而“cat sat”查詢尋找的是包含單詞“cat”之后緊跟單詞“sat”的頁面。在上面那個由三個網(wǎng)頁組成的簡單例子中,cat sat查詢結(jié)果命中第1頁和第3頁,但“cat sat”查詢只返回一次命中,就在第1頁。