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練習11 倒排索引索引
- MapReduce原理及簡單實現
- ElasticSearch 倒排索引(Inverted Index)| 什麼是倒排索引?Elasticsearch索引Index
- Elaticsearch倒排索引索引
- 筆記五:倒排索引筆記索引
- 超簡單實現iOS列表的索引功能iOS索引
- ES 筆記五:倒排索引筆記索引
- 什麼是行儲存和列儲存?正排索引和倒排索引?MySQL既不是倒排索引,也索引MySql
- 使用 Docker 和 Nginx 實現簡單目錄索引服務DockerNginx索引
- Yearning外接工單通知實現思路
- Elasticsearch 6.x 倒排索引與分詞Elasticsearch索引分詞
- 倒排索引及ES相關概念對比MySQL索引MySql
- 《Elasticsearch技術解析與實戰》Chapter 1.1:Elasticsearch入門和倒排索引ElasticsearchAPT索引
- 基於Python實現MapReducePython
- 線段樹簡單思路
- AspectJ簡單實現
- FastClick簡單實現AST
- Promise 簡單實現Promise
- ReadableStream 簡單實現
- Express 簡單實現Express
- 簡版排程中心搭建及實現思路
- MongoDB索引的簡單理解MongoDB索引
- 簡單易懂的索引原理索引
- 實現動態表單的一種思路
- 精簡版 koa 簡單實現
- Elasticsearch 中為什麼選擇倒排索引而不選擇 B 樹索引Elasticsearch索引
- 瀑布流簡單實現
- 如何簡單實現ELT?
- 感知機簡單實現
- ArrayList的簡單實現
- 實現簡單的BitMap
- 簡單版Promise實現Promise
- 簡單實現vuex原理Vue
- AOP的簡單實現
- 物件池簡單實現物件
- React 簡單實現(一)React
- 簡單的 HashMap 實現HashMap
- vue 實現原理及簡單示例實現Vue
- 智慧家居簡單實現---使用ESP8266簡單實現和APP通訊APP