mapreduce實現倒排索引
目的:
產生一個資料集的索引以便提供更快的搜尋或資料豐富能力。
動機:
對大的資料集建立一個關鍵字的索引,通常可以方便通過指定關鍵字搜尋到其包含特定值的對應記錄。儘管建立倒排索引的過程需要預先進行額外的處理,但花費時間做預處理可以極大地縮減查詢時所需要的時間。
適用場景:
倒排索引通常用在需要快速搜尋查詢響應的場景。可以對一個查詢的結果進行預處理並存入資料庫中。
真實場景:
搜尋引擎通過建立索引來提高搜尋效能。
假設輸入一個關鍵字,讓搜尋引擎的爬蟲去抓取網上的資料並建立一個頁面的列表返回給你,這樣的查詢將花費非常長的時間才能完成。通過建立倒排索引,搜尋引擎可以預先知道關鍵字所對應的網頁,因此只要簡單地將相關內容展示給使用者就可以了。這樣的索引通常也會儲存在一個資料庫中來提高檢索的效率。建立一個倒排索引的工程對MapReduce來說非常簡單,因為MapReduce框架將負責處理大部分工作。
我們建立測試資料如下:
www.baidu.com zhangsan lisi wangwu renliu
www.google.com zhangsan lisi wangwu
www.sohu.com zhangsan lisi
www.163.com zhangsan
每行資料在模擬一個網頁,我們約定第一個field代表url,後面欄位代表該網頁中出現的關鍵字
通過倒排索引我們將得到如下結果:
zhangsan www.baidu.com www.google.com www.sohu.com www.163.com
lisi www.baidu.com www.google.com www.sohu.com
wangwu www.baidu.com www.google.com
renliu www.baudu.com
我們可以看出,資料本來是以url作為索引、關鍵字為值的,經過倒排關鍵字稱為了索引、url為值。這樣就可以快速查到關鍵字對應的url。
package com.mr.invertedIndex;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
/**
* 倒排索引
*
* @author luobao
*
*/
public class inverteIndex {
public static class MyMapper extends Mapper<Object, Text, Text, Text> {
public void map(Object key, Text value, Context context)
throws IOException, InterruptedException {
String[] arrStr = value.toString().split(" ");
for (int i = 1; i < arrStr.length; i++) {
context.write(new Text(arrStr[i]), new Text(arrStr[0]));
}
}
}
public static class MyReducer extends Reducer<Text, Text, Text, Text> {
public void reduce(Text key, Iterable<Text> values, Context context)
throws IOException, InterruptedException {
StringBuilder result = new StringBuilder();
boolean first = true;
for (Text val : values) {
if (first) {
result.append(val.toString());
first = false;
} else {
result.append(" " + val.toString());
}
}
context.write(key, new Text(result.toString()));
}
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf);
job.setJarByClass(inverteIndex.class);
job.setMapperClass(MyMapper.class);
job.setCombinerClass(MyReducer.class);
job.setReducerClass(MyReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
FileInputFormat.addInputPath(job, new Path(
"hdfs://192.168.40.186:9000/input/invertedIndex"));
FileOutputFormat.setOutputPath(job, new Path(
"hdfs://192.168.40.186:9000/output"));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
相關文章
- MapReduce實戰:倒排索引索引
- MapReduce實現倒排索引(簡單思路)索引
- 搜尋引擎:MapReduce實戰----倒排索引索引
- 細節決定成敗 MapReduce任務實戰 倒排索引索引
- MapReduce程式設計例項之倒排索引 1程式設計索引
- Hadoop-Map/Reduce實現實現倒排索引Hadoop索引
- ElasticSearch 倒排索引(Inverted Index)| 什麼是倒排索引?Elasticsearch索引Index
- Lucene 4.X 倒排索引原理與實現: (2) 倒排表的格式設計索引
- 筆記五:倒排索引筆記索引
- ES 筆記五:倒排索引筆記索引
- 倒排索引優化 - 跳錶索引優化
- Lucene 4.X 倒排索引原理與實現: (1) 詞典的設計索引
- 什麼是行儲存和列儲存?正排索引和倒排索引?MySQL既不是倒排索引,也索引MySql
- Elasticsearch 6.x 倒排索引與分詞Elasticsearch索引分詞
- 《Elasticsearch技術解析與實戰》Chapter 1.1:Elasticsearch入門和倒排索引ElasticsearchAPT索引
- 六十四、Elasticsearch核心原理-再談倒排索引Elasticsearch索引
- 倒排索引及ES相關概念對比MySQL索引MySql
- Lucene 4.X 倒排索引原理與實現: (3) Term Dictionary和Index檔案 (FST詳細解析)索引Index
- MapReduce原理及簡單實現
- 基於Python實現MapReducePython
- 【預研】搜尋引擎基礎——inverted index(倒排索引)Index索引
- Elasticsearch 中為什麼選擇倒排索引而不選擇 B 樹索引Elasticsearch索引
- ElasticSearch所使用的倒排索引的思想和使用場景Elasticsearch索引
- InnoDB索引實現索引
- 搜尋學習基礎--倒排索引的過程解讀索引
- MySQL——索引實現原理MySql索引
- PostgreSQLGIN索引實現原理SQL索引
- 談談Hadoop MapReduce和Spark MR實現HadoopSpark
- 使用Go語言實現簡單MapReduce框架Go框架
- 後端技術雜談1:搜尋引擎基礎倒排索引後端索引
- 使用IDEA+Maven實現MapReduce的WordCount功能IdeaMaven
- 【大創_社群劃分】——PageRank演算法MapReduce實現演算法
- mysql索引底層實現MySql索引
- 用 Golang 寫一個搜尋引擎(0x02)--- 倒排索引技術Golang索引
- MySQL索引底層實現原理MySql索引
- Oracle如何實現B樹索引Oracle索引
- C# 實現自己索引器C#索引
- ElasticSearch7.3 學習之倒排索引揭祕及初識分詞器(Analyzer)Elasticsearch索引分詞