一個(gè)搜索引擎如何才能有效地進(jìn)行一次短語(yǔ)查詢呢?繼續(xù)說(shuō)“cat sat”這個(gè)例子。第一步和平常的多詞查詢 cat sat一樣,從單詞表中獲取每個(gè)單詞出現(xiàn)的網(wǎng)頁(yè)列表,在這個(gè)例子中就是出現(xiàn)在第1頁(yè)和第3頁(yè)的“cat”;“sat”也一樣,出現(xiàn)在第1頁(yè)和第3頁(yè)。不過(guò)搜索引擎到這里就卡住了。搜索引擎很確切地知道兩個(gè)單詞同時(shí)出現(xiàn)在頁(yè)面1和頁(yè)面3上,但沒(méi)有辦法來(lái)分辨這些單詞是否以正確的順序緊挨著彼此出現(xiàn)。你也許會(huì)想,搜索引擎可以返回查看原網(wǎng)頁(yè),看這個(gè)短語(yǔ)是否存在。這的確是個(gè)可能的解決方案,但效率卻非常非常低。這需要遍歷每一個(gè)可能包含這個(gè)短語(yǔ)的網(wǎng)頁(yè)的全部?jī)?nèi)容,而且可能有海量這樣的網(wǎng)頁(yè)。記住,我們?cè)谶@里打交道的是一個(gè)只由三個(gè)頁(yè)面組成的極小的例子,真正的搜索引擎必須從數(shù)百億個(gè)網(wǎng)頁(yè)中找出正確的結(jié)果。
注意英文單詞的雙引號(hào)?!g者注
詞位置把戲
這一問(wèn)題的解決方案是讓現(xiàn)代搜索引擎運(yùn)行良好的首個(gè)、真正精巧的思想:索引應(yīng)該不單單存儲(chǔ)頁(yè)碼,還要存儲(chǔ)頁(yè)面內(nèi)的位置。這些位置并不神秘:它們只是代表了一個(gè)詞在頁(yè)面中的位置。第3個(gè)詞的位置是3,第29個(gè)詞的位置是29,依此類推。例子中三個(gè)頁(yè)面組成的數(shù)據(jù)集如下頁(yè)圖所示,還加上了詞位置。圖下面的是索引——由存儲(chǔ)頁(yè)碼和詞位置中得出的結(jié)果組成。我們稱這種創(chuàng)建索引的方法為“詞位置把戲”(word location trick)。舉幾個(gè)例子,以確保大家理解了詞位置把戲。索引的第一行是“a3-5.”。這意味著詞“a”只在數(shù)據(jù)集中出現(xiàn)過(guò)一次,是第3頁(yè)的第5個(gè)單詞。索引中最長(zhǎng)的一行是“the 1-1 1-5 2-1 2-5 3-1”。這一行可以讓你知道,這個(gè)數(shù)據(jù)集中所有出現(xiàn)單詞“the”的具體位置。它在第1頁(yè)出現(xiàn)過(guò)兩次(位置1和5),第2頁(yè)出現(xiàn)過(guò)兩次(位置1和5),第3頁(yè)出現(xiàn)過(guò)1次(位置1)。
你還記得介紹頁(yè)內(nèi)詞位置的目的嗎?是為了解決如何有效地進(jìn)行短語(yǔ)查詢這個(gè)問(wèn)題。讓我們來(lái)看看如何用這個(gè)新索引做一次短語(yǔ)查詢。還是和前面一樣,查詢短語(yǔ)“cat sat”。第一步和使用舊索引時(shí)一樣:從索引中提取單個(gè)詞的位置,“cat”的位置是1-2、3-2,“sat”的位置是1-3、3-7。到這里還好:我們知道短語(yǔ)查詢“cat sat”唯一可能的命中就是在第1頁(yè)和第3頁(yè)。但與之前一樣,我們還不確定相同的短語(yǔ)是否出現(xiàn)在了這些頁(yè)面中——有可能這兩個(gè)單詞的確出現(xiàn)了,但并不是以正確的順序彼此相鄰。幸運(yùn)的是,從位置信息中確認(rèn)這一點(diǎn)很容易。首先從第1頁(yè)開(kāi)始。根據(jù)索引信息,我們知道“cat”出現(xiàn)在第1頁(yè)的位置2(這就是1-2的含義)。我們還知道“sat”出現(xiàn)在第1頁(yè)的位置3(這是1-3的含義)。但如果“cat”在位置2,“sat”在位置3,我們就知道“sat”緊挨著出現(xiàn)在“cat”之后(因?yàn)?之后立即就是3)——因此我們尋找的整個(gè)短語(yǔ)“cat sat”必定出現(xiàn)在第1頁(yè),并從位置2開(kāi)始。