1. 程式人生 > >搜尋引擎原理 – 正排索引、倒排索引以及齊普夫法則

搜尋引擎原理 – 正排索引、倒排索引以及齊普夫法則

我們在提交一個關鍵字時,搜尋引擎是如何快速定位到包含有此關鍵字的相關頁面的?這就是索引系統的功勞,索引系統負責為關鍵字和網頁建立對應關係,使得在海量網頁中迅速查詢成為可能。

索引

首先我們先介紹下索引(Index)。索引本質上是一種記錄資訊的資訊,它本身佔較小的體積,但記錄了關鍵字在整個系統中出現的位置。日常生活中,我們也有很多使用索引的例子,比如一本圖書,它的目錄就是一個索引檔案,每條索引記錄了章節所在頁碼,能使讀者快速翻閱至所需章節。網頁被抓取並經過分析系統分析後,索引系統便會給網頁一個唯一的ID,並將網頁ID和位置記錄在索引檔案中。

需要注意的是,由於網頁是海量的,為了儲存和計算考慮,網頁ID會盡可能的短,並且最好是長整數而不是字串。因為字串在排序、查詢時的效能遠遠不如整數,並且字串位元組數多,造成儲存和記憶體壓力加大。通常情況下會把URL對映成64位或128位的二進位制數。

正排索引

正排索引是從網頁到關鍵字的對映,一般含有網頁ID、關鍵字(或關鍵字ID)、關鍵字出現次數、關鍵字出現位置等幾個重要引數。例如給定兩篇文件“中國人民愛中國”和“中國歷史悠久”,經分詞後建立的一個典型的正排索引如下所示:

正排索引

其中,Hits代表了關鍵字在文件中出現次數,List代表了關鍵字出現在文件中的位置。

因此正排索引是通過網頁來尋找關鍵字,可以知道一個網頁中是否包含了某個關鍵字、關鍵字出現了幾次以及關鍵字出現的位置。但是網頁檢索是通過關鍵字來找文件,因此需要把正排索引轉換為倒排索引,才能滿足實際的需求。

倒排索引

倒排索引是從關鍵字到文件的對映,可以分為兩個部分。

第一部分為索引檔案,記錄了關鍵字(或關鍵字ID)、出現在多少文件中以及這些文件在文件庫中的偏移量。

第二部分為文件檔案,記錄了文件ID、關鍵字出現次數以及關鍵字在文件中出現的位置。

倒排索引

例如:詞“中國”在兩篇文件中均出現,則nDocs=2,Offset分別為兩篇文件的偏移地址。根據兩個地址分別找到DocID為000001和000002的文件。“中國”在第一篇文件中出現了2次,偏移量分別為0,3,在第二篇文件中出現了1次,偏移量為0。

這樣輸入任意一個關鍵字,通過搜尋索引檔案,就能找到對應的文件地址,再根據文件地址在文件檔案中查詢,就能找到相關文件並能顯示關鍵字在各文件中的位置。

齊普夫法則

在一個數據集(一本書、一個網頁集合等)中,排名第k的詞,與其在資料集中出現的次數Nk的乘積是一個常數C,即k*Nk=C,而C約等於資料集的總詞數。

又由於所有詞頻率出現之和為1,因此容易通過數學推匯出:一個排名為k的詞,它的實際詞頻是1/(lnC’*k),C’為資料集總詞彙數(C是總詞數)。

由於各詞的詞頻不同,因此在做索引時,可以根據詞頻對關鍵字ID進行哈夫曼編碼。對詞頻較高的詞,使用短編碼,詞頻較低的詞,使用長編碼,這樣可以保證儲存空間和查詢速度的全域性最優。