常規的索引是文件到關鍵詞的對映:文件——>關鍵詞,但是這樣檢索關鍵詞的時候很費力,要一個文件一個文件的遍歷一遍。於是人們發明了倒排索引!倒排索引是關鍵詞到文件的對映:關鍵詞——>文件。因此,只要有關鍵詞,立馬就能找到在那個文件裡出現過,帶來了極大的方便。
1.倒排索引
倒排索引有兩種不同的反向索引形式:
第一,一條記錄的水平反向索引(或者反向檔案索引)包含每個引用單詞的文件的列表。
第二,一個單詞的水平反向索引(或者完全反向索引)又包含每個單詞在一個文件中的位置。
後者的形式提供了更多的相容性(比如短語搜尋),但是需要更多的時間和空間來建立。
舉例:
以英文為例,下面是要被索引的文字:
T0= "it is what it is"
T1= "what is it"
T2= "it is a banana"
我們就能得到下面的反向檔案索引:
檢索的條件"what", "is" 和"it" 將對應這個集合:{0,1}∩{0,1,2}∩{0,1,2}={0,1}。
對相同的文字,我們得到後面這些完全反向索引,有文件數量和當前查詢的單詞結果組成的的成對資料。同樣,文件數量和當前查詢的單詞結果都從零開始。
所以,"banana": {(2, 3)} 就是說 “banana”在第三個文件裡 (T2),而且在第三個文件的位置是第四個單詞(地址為 3)。
如果我們執行短語搜尋"what is it" 我們得到這個短語的全部單詞各自的結果所在文件為文件0和文件1。但是這個短語檢索的連續的條件僅僅在文件1得到。
2.Map過程
首先使用預設的TextInputFormat類對輸入檔案進行處理,得到文字中每行的偏移量及其內容,Map過程首先必須分析輸入的
存在兩個問題,第一:
第二,通過一個Reduce過程無法同時完成詞頻統計和生成文件列表,所以必須增加一個Combine過程完成詞頻統計。
3.Combine過程
將key值相同的value值累加,得到一個單詞在文件中的詞頻,如圖。
4.Reduce過程
講過上述兩個過程後,Reduce過程只需將相同key值的value值組合成倒排索引檔案所需的格式即可,剩下的事情就可以直接交給MapReduce框架進行處理了。
完整程式碼如下:
原作者: coding wu