MapReduce實現倒排索引(簡單思路)
倒排索引(Inverted index),也常被稱為反向索引、置入檔案或反向檔案,是一種索引方法,被用來儲存在全文搜尋下某個單詞在一個文件或者一組文件中的儲存位置的對映。它是文件檢索系統中最常用的資料結構。透過倒排索引,可以根據單詞快速獲取包含這個單詞的文件列表。倒排索引主要由兩個部分組成:“單詞詞典”和“倒排檔案”。
有兩種不同的反向索引形式:
一條記錄的水平反向索引(或者反向檔案索引)包含每個引用單詞的文件的列表。
一個單詞的水平反向索引(或者完全反向索引)又包含每個單詞在一個文件中的位置。
後者的形式提供了更多的相容性(比如短語搜尋),但是需要更多的時間和空間來建立。
現代搜尋引擎的索引都是基於倒排索引。相比“簽名檔案”、“字尾樹”等索引結構,“倒排索引”是實現單詞到文件對映關係的最佳實現方式和最有效的索引結構.
1.map階段:將單詞和URI組成Key值(如“MapReduce :1.txt”),將詞頻作為value。
利用MR框架自帶的Map端排序,將同一文件的相同單詞的詞頻組成列表,傳遞給Combine過程,實現類似於WordCount的功能。
Class Map {
method map(){
//獲取輸入分片對應的檔名
String fileName=((FileSplit)context.getInputSplit()).getPath().getName();
for(String word : value.split()){
//輸出:---<"MapReduce:1.txt",1>
context.write(new Text(word+":"+fileName), new Longwritable(1))
}
}
}
2.Combiner階段:將key值相同的value值累加,得到一個單詞在文件中的詞頻。
如果直接將Map的輸出作為Reduce的輸入,當前key值(由單詞、URI組成)無法保證相同的word會分發到同一個Reduce處理,所以必須修改key值和value值。將單詞作為key值,URI和詞頻作為value值,可以利用MR框架預設的HashPartitioner類完成分割槽過程,將相同單詞的所有記錄傳送給同一個Reducer處理。
Class Combine{
method reduce(){
for(Long long : v2s){
//詞頻求和
sum += Long.parseLong(long.toString());
}
//輸出:----<"Mapreduce","0.txt:2">
context.write(new Text(word), new Text(fileName+":"+sum));
}
}
3.reduce階段:將相同key值的value值組合成倒排索引檔案所需的格式即可。
Class Reduce{
method reduce(){
String valueList = new String();
//輸入:<"MapReduce",list("0.txt:1","1.txt:1","2.txt:1")>
for(Text text : v2s){
valueList += text.toString()+";";
}
//輸出:<"MapReduce","0.txt:1,1.txt:1,2.txt:1">
context.write(key, new Text(valueList));
}
}
注意事項:本例項設計的倒排索引在檔案數目上沒有限制,但是單詞檔案不宜過大,要保證每個檔案對應一個 split。否則,由於 Reduce 過程沒有進一步統計詞頻,最終結果可能會出現詞頻未統計完全的單詞。
解決方案:
- 覆寫 InputFormat 類將每個輸入檔案分為一個 split,避免上述情況。
- 執行兩次 MR 任務,第一次 MR 用於統計詞頻,第二次 MR 用於生成倒排索引。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30316686/viewspace-2119952/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mapreduce實現倒排索引索引
- MapReduce實戰:倒排索引索引
- 搜尋引擎:MapReduce實戰----倒排索引索引
- 細節決定成敗 MapReduce任務實戰 倒排索引索引
- MapReduce原理及簡單實現
- MapReduce程式設計例項之倒排索引 1程式設計索引
- Hadoop-Map/Reduce實現實現倒排索引Hadoop索引
- 使用Go語言實現簡單MapReduce框架Go框架
- ElasticSearch 倒排索引(Inverted Index)| 什麼是倒排索引?Elasticsearch索引Index
- Lucene 4.X 倒排索引原理與實現: (2) 倒排表的格式設計索引
- 超簡單實現iOS列表的索引功能iOS索引
- 筆記五:倒排索引筆記索引
- ES 筆記五:倒排索引筆記索引
- 倒排索引優化 - 跳錶索引優化
- Lucene 4.X 倒排索引原理與實現: (1) 詞典的設計索引
- 什麼是行儲存和列儲存?正排索引和倒排索引?MySQL既不是倒排索引,也索引MySql
- MapReduce應用案例--簡單排序排序
- 簡單理解什麼是MapReduce!
- 使用 Docker 和 Nginx 實現簡單目錄索引服務DockerNginx索引
- 一個簡單的MapReduce示例(多個MapReduce任務處理)
- Yearning外接工單通知實現思路
- 線段樹簡單思路
- Promise 簡單實現Promise
- FastClick簡單實現AST
- Express 簡單實現Express
- AspectJ簡單實現
- getElementsByClassName簡單實現
- Elasticsearch 6.x 倒排索引與分詞Elasticsearch索引分詞
- 如何簡單解釋 MapReduce 演算法演算法
- 簡版排程中心搭建及實現思路
- 實現動態表單的一種思路
- 《Elasticsearch技術解析與實戰》Chapter 1.1:Elasticsearch入門和倒排索引ElasticsearchAPT索引
- 精簡版 koa 簡單實現
- MapReduce 簡介
- 六十四、Elasticsearch核心原理-再談倒排索引Elasticsearch索引
- 倒排索引及ES相關概念對比MySQL索引MySql
- 簡單的計算最值的MapReduce程式
- 感知機簡單實現