MapReduce 简单的全文搜索

上一个已经实现了反向索引,那么为什么不尝试下全文搜索呢。例如有了

Hello     file3.txt:1;
MapReduce     file3.txt:2;fil1.txt:1;fil2.txt:1;
bye     file3.txt:1; 
is     fil1.txt:1;fil2.txt:2;
powerful     fil2.txt:1;
simple     fil2.txt:1;fil1.txt:1;

那么我要找MapReduce is simple,那么就有file1 和file2有。基本的思想就是先按照MapReduce is simple一个个在索引上查找,例如

MapReduce 3,1,2

is 1,2

simple 2,1

接着以file作为key,word作为value输出

1 MapReduce is simple

2 MapReduce is simple

3 MapReduce

接下来在Reduce中对各个value的单词名进行统计,如果超过3个,那就说明有匹配的了。

这里主要的技术是map,Reduce如何获得命令行参数。在主类中可以通过

String[] pathargs= new GenericOptionsParser(conf, args).getRemainingArgs();

来获得参数,但是如何向map和reduce传参呢,这里有三种方法,只看了一种,因为感觉够用了。

我们通过在主类中的配置实例写参数conf.set(key,value)这里的key,value都是String。要记住一点,这个语句一定要在jog.getInstance(conf)之前,否则都实例化了一个job了还怎么配置呢。接着在map或者reduce中通过

Configuration  conf=context.getConfiguration()来获得主类的配置文件。接着就可以conf.get(key)了。

代码具体如下:

public class Find {

public static void main(String[] args) throws Exception {

Configuration conf = new Configuration();

String[] pathargs= new GenericOptionsParser(conf, args).getRemainingArgs();

if(pathargs.length <2){

System. err.println(pathargs.length );

System. exit(2);

}

conf.set( "argsnum",Integer.toString(pathargs. length));

for(int i=2;i<pathargs.length;i++){

conf.set( "args"+i,pathargs[i]);

System. out.println(pathargs[i]);

}

Job job = Job. getInstance(conf, "JobName");

job.setJarByClass(org.apache.hadoop.examples10.Find. class);

// TODO: specify a mapper

job.setMapperClass(MyMapper. class);

// TODO: specify a reducer

job.setReducerClass(MyReducer. class);

// TODO: specify output types

job.setOutputKeyClass(Text. class);

job.setOutputValueClass(Text. class);

// TODO: specify input and output DIRECTORIES (not files)

FileInputFormat. setInputPaths(job, new Path(pathargs[0]));

FileOutputFormat. setOutputPath(job, new Path(pathargs[1]));

if (!job.waitForCompletion(true))

return;

}

}

public class MyMapper extends Mapper<LongWritable, Text, Text, Text> {

//String[] content={"MapReduce","is","simple"};

public void map(LongWritable ikey, Text ivalue, Context context)

throws IOException, InterruptedException {

Configuration conf=context.getConfiguration();

int argsnum=Integer.parseInt(conf.get( "argsnum"));

//int argsnum=conf.get(" argsnum");

int i=0;

ArrayList<String> content= new ArrayList<String>();

for(i=2;i<argsnum;i++ ){

//System.out.println(conf.get("args"+i));

content.add(conf.get( "args"+i));

}

String line=ivalue.toString();

String key=line.split( "         " )[0];

String value=line.split( "      " )[1];

StringTokenizer st= new StringTokenizer(value,";" );

for(i=0;i<content.size();i++){

if(content.get(i).compareTo(key)==0){

ArrayList<String> filelist=new ArrayList<String>();

while(st.hasMoreTokens()){

String file=st.nextToken();

file=file.split( ":")[0];

filelist.add(file);

}

for(int j=0;j<filelist.size();j++){

context.write( new Text(filelist.get(j)),new Text(key));

}

}

}

}

}

public class MyReducer extends Reducer<Text, Text, Text, Text> {

public void reduce(Text _key, Iterable<Text> values, Context context)

throws IOException, InterruptedException {

Configuration conf=context.getConfiguration();

int argsnum=Integer.parseInt(conf.get( "argsnum"));

// process values

int sum=0;

String filename= new String();

for(int i =2;i<argsnum; i++ ){

//System.out.println(conf.get("args"+i));

filename+=(conf.get( "args"+i));

filename+= " ";

}

for (Text val : values) {

sum++;

}

if(sum>=argsnum-2){

context.write( new Text(filename),_key);

}

}

}

时间: 2024-12-14 18:05:53

MapReduce 简单的全文搜索的相关文章

MapReduce 简单的全文搜索2

上一个全文搜索实现了模糊查找,这个主要实现了精确查找,就是比如你查找mapreduce is simple那么他就只查找有这个句子的文章,而不是查找有这三个单词的文章. 这个版本需要重写反向索引,因为需要查找句子,所以需要定位每个单词的在文章中的位置,所以我们的反向索引需要加上单词所在的位置,即我们希望的输出是: MapReduce file1.txt:<1,2,3>;file2.txt:<5,3,1>;这种格式的. 其实这一步比较简单.我们在map的时候输出为 “filename

Django 博客实现简单的全文搜索

作者:HelloGitHub-追梦人物 文中所涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 搜索是一个复杂的功能,但对于一些简单的搜索任务,我们可以使用 Django Model 层提供的一些内置方法来完成.现在我们来为我们的博客提供一个简单的搜索功能. 概述 博客文章通常包含标题和正文两个部分.当用户输入某个关键词进行搜索后,我们希望为用户显示标题和正文中含有被搜索关键词的全部文章.整个搜索的过程如下: 用户在搜素框中输入搜索关键词,假设为 "django",

如何在MySQL中获得更好的全文搜索结果

很多互联网应用程序都提供了全文搜索功能,用户可以使用一个词或者词语片断作为查询项目来定位匹配的记录.在后台,这些程序使用在一个SELECT 查询中的LIKE语句来执行这种查询,尽管这种方法可行,但对于全文查找而言,这是一种效率极端低下的方法,尤其在处理大量数据的时候. mysql针对这一问题提供了一种基于内建的全文查找方式的解决方案.在此,开发者只需要简单地标记出需要全文查找的字段,然后使用特殊的MySQL方法在那些字段运行搜索,这不仅仅提高了性能和效率(因为MySQL对这些字段做了索引来优化搜

全文搜索原理简单解析

文前声明:本人只是知识的搬运工,文中许多知识和观点大多数都是来自于网络或书本,因为没有记录的习惯学习研究完,便忘记名称了,如若还记得,在文后自会添加备注. 注:这是本人的第一篇薄文,水平相形见拙,有错误之处,欢迎指正. 今年的计划是存储领域,希望能深入的了解其原理,如果能有创造性的写出一个自己的文件系统出来就更好了,到目前为止尚无动工的迹象,估计会顺延至明年了吧! 我的计划正好赶上公司的总规划,于是便接了“大数据”的活.刚开始进入这一行,走了不少弯路,说多了都是泪(这不是本文的主题,就此打住,后

sphinx全文搜索Php方面的简单处理

第一次尝试用sphinx来做全文搜索,可能有很多见解都不是很正确.有不同的想法,大家可以提出来. 现在版本的sphinx不知道支不支持中文了,问了群里的朋友都说不支持,所有用了以下的这种方法来做. 1.文章的处理. 假如文章表为article_main id title summary content time 1 测试的标题 测试的摘要 测试的内容 123123123 由于sphinx不支持中文(真的吗?这里当它是吧) 我们新建立一个表article_unicode id article_id

MySQL 全文搜索支持, mysql 5.6.4支持Innodb的全文检索和类memcache的nosql支持

背景:搞个个人博客的全文搜索得用like啥的,现在mysql版本号已经大于5.6.4了也就支持了innodb的全文搜索了,刚查了下目前版本号都到MySQL Community Server 5.6.19 了,所以,一些小的应用可以用它做全文搜索了,像sphinx和Lucene这样偏重的.需要配置或开发的,节省了成本. 这儿有一个原创的Mysql全文搜索的文章, mysql的全文搜索功能:http://blog.csdn.net/bravekingzhang/article/details/672

[Elasticsearch] 全文搜索 (一) - 基础概念和match查询

全文搜索(Full Text Search) 现在我们已经讨论了搜索结构化数据的一些简单用例,是时候开始探索全文搜索了 - 如何在全文字段中搜索来找到最相关的文档. 对于全文搜索而言,最重要的两个方面是: 相关度(Relevance) 查询的结果按照它们对查询本身的相关度进行排序的能力,相关度可以通过TF/IDF,参见什么是相关度,地理位置的邻近程度(Proximity to a Geo-location),模糊相似性(Fuzzy Similarity)或者其它算法进行计算. 解析(Analys

记一次企业级爬虫系统升级改造(五):基于JieBaNet+Lucene.Net实现全文搜索

实现效果: 上一篇文章有附全文搜索结果的设计图,下面截一张开发完成上线后的实图: 基本风格是模仿的百度搜索结果,绿色的分页略显小清新. 目前已采集并创建索引的文章约3W多篇,索引文件不算太大,查询速度非常棒. 刀不磨要生锈,人不学要落后.每天都要学一些新东西. 基本技术介绍: 还记得上一次做全文搜索是在2013年,主要核心设计与代码均是当时的架构师写的,自己只能算是全程参与. 当时使用的是经典搭配:盘古分词+Lucene.net. 前几篇文章有说到,盘古分词已经很多年不更新了,我在Support

初识Lucene 4.5全文搜索

近期想研究下lucene,但网络上的教程大多都是lucne 3.x版本的讲解.可是lucene版本的更新速度快的惊人,目前已经到了4.8版了,只好去查阅官方文档.虽然英文不大好,但稍微对比了下发现3.x版本至4.x版本的修改非常之大.接下来我就以4.5版来操作,分享下我对luence的初步认识. 先给大家看一张图(来至<Lucene  in  action>): 此图很形象的描述了lucene的基本流程,简而言之就是:1.创建索引:2.检索索引. 太深的道理与原理我目前也还是一知半解,所以就以