倒排索引(英語:Inverted index),也常被稱為反向索引、置入檔案或反向檔案,被用來存儲在全文搜索下某個單詞在一個文檔或者一組文檔中的存儲位置的映射。它是文檔檢索系統(tǒng)中最常用的數(shù)據(jù)結(jié)構(gòu)。
有兩種不同的反向索引形式:
一條記錄的水平反向索引(或者反向檔案索引)包含每個引用單詞的文檔的列表。
一個單詞的水平反向索引(或者完全反向索引)又包含每個單詞在一個文檔中的位置。
后者的形式提供了更多的兼容性(比如短語搜索),但是需要更多的時間和空間來創(chuàng)建。
所謂的正排索引是從索引文檔到關(guān)鍵詞到內(nèi)容,倒排索引則是相反從關(guān)鍵詞到詞頻,位置,目錄等信息,現(xiàn)在通常用于搜索的。由于互聯(lián)網(wǎng)上的數(shù)據(jù)量無限大,不可能存儲足夠多的文檔,所以正排索引用處不大。
有兩種不同的反向索引形式:
一條記錄的水平反向索引(或者反向檔案索引)包含每個引用單詞的文檔的列表。
一個單詞的水平反向索引(或者完全反向索引)又包含每個單詞在一個文檔中的位置。
?我們就能得到下面的反向文件索引:
-
{\displaystyleT_{0}=}
"it is what it is"
-
{\displaystyleT_{1}=}
"what is it"
-
{\displaystyleT_{2}=}
"it is a banana"
"a": {2}
"banana": {2}
"is": {0, 1, 2}
"it": {0, 1, 2}
"what": {0, 1}
檢索的條件"what", "is" 和 "it" 將對應(yīng)這個集合: 對相同的文字,我們得到后面這些完全反向索引,有文檔數(shù)量和當(dāng)前查詢的單詞結(jié)果組成的的成對數(shù)據(jù)。 同樣,文檔數(shù)量和當(dāng)前查詢的單詞結(jié)果都從零開始。所以,"banana": {(2, 3)}
就是說 "banana"在第三個文檔里 ( {\displaystyle T_{2}} T_{2}),而且在第三個文檔的位置是第四個單詞(地址為 3)。
"a": {(2, 2)}
"banana": {(2, 3)}
"is": {(0, 1), (0, 4), (1, 1), (2, 1)}
"it": {(0, 0), (0, 3), (1, 2), (2, 0)}
"what": {(0, 2), (1, 0)}
如果我們執(zhí)行短語搜索"what is it" 我們得到這個短語的全部單詞各自的結(jié)果所在文檔為文檔0和文檔1。但是這個短語檢索的連續(xù)的條件僅僅在文檔1得到。
反向索引數(shù)據(jù)結(jié)構(gòu)是典型的搜索引擎檢索算法重要的部分。
一個搜索引擎執(zhí)行的目標(biāo)就是優(yōu)化查詢的速度:找到某個單詞在文檔中出現(xiàn)的地方。以前,正向索引開發(fā)出來用來存儲每個文檔的單詞的列表,接著掉頭來開發(fā)了一種反向索引。 正向索引的查詢往往滿足每個文檔有序頻繁的全文查詢和每個單詞在校驗文檔中的驗證這樣的查詢。
實際上,時間、內(nèi)存、處理器等等資源的限制,技術(shù)上正向索引是不能實現(xiàn)的。
為了替代正向索引的每個文檔的單詞列表,能列出每個查詢的單詞所有所在文檔的列表的反向索引數(shù)據(jù)結(jié)構(gòu)開發(fā)了出來。
隨著反向索引的創(chuàng)建,如今的查詢能通過立即的單詞標(biāo)示迅速獲取結(jié)果(經(jīng)過隨機(jī)存儲)。隨機(jī)存儲也通常被認(rèn)為快于順序存儲。
構(gòu)建方法
簡單法
索引的構(gòu)建[4] 相當(dāng)于從正排表到倒排表的建立過程。當(dāng)我們分析完網(wǎng)頁時 ,得到的是以網(wǎng)頁為主碼的索引表。當(dāng)索引建立完成后 ,應(yīng)得到倒排表 ,具體流程如圖所示:
流程描述如下:
1)將文檔分析稱單詞term標(biāo)記,
2)使用hash去重單詞term
3)對單詞生成倒排列表
倒排列表就是文檔編號DocID,沒有包含其他的信息(如詞頻,單詞位置等),這就是簡單的索引。
這個簡單索引功能可以用于小數(shù)據(jù),例如索引幾千個文檔。然而它有兩點限制:
1)需要有足夠的內(nèi)存來存儲倒排表,對于搜索引擎來說, 都是G級別數(shù)據(jù),特別是當(dāng)規(guī)模不斷擴(kuò)大時 ,我們根本不可能提供這么多的內(nèi)存。
2)算法是順序執(zhí)行,不便于并行處理。
合并法
歸并法[4] ,即每次將內(nèi)存中數(shù)據(jù)寫入磁盤時,包括詞典在內(nèi)的所有中間結(jié)果信息都被寫入磁盤,這樣內(nèi)存所有內(nèi)容都可以被清空,后續(xù)建立索引可以使用全部的定額內(nèi)存。
歸并索引
歸并索引
如圖 歸并示意圖:
合并流程:
1)頁面分析,生成臨時倒排數(shù)據(jù)索引A,B,當(dāng)臨時倒排數(shù)據(jù)索引A,B占滿內(nèi)存后,將內(nèi)存索引A,B寫入臨時文件生成臨時倒排文件,
2) 對生成的多個臨時倒排文件 ,執(zhí)行多路歸并 ,輸出得到最終的倒排文件 ( inverted file)。
合并流程
合并流程
索引創(chuàng)建過程中的頁面分析 ,特別是中文分詞為主要時間開銷。算法的第二步相對很快。這樣創(chuàng)建算法的優(yōu)化集中在中文分詞效率上。