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

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);
                                }
                }
 
}

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

  1. MapReduce 简单的全文搜索2

    上一个全文搜索实现了模糊查找,这个主要实现了精确查找,就是比如你查找mapreduce is simple那么他就只查找有这个句子的文章,而不是查找有这三个单词的文章. 这个版本需要重写反向索引,因为 ...

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

    作者:HelloGitHub-追梦人物 文中所涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 搜索是一个复杂的功能,但对于一些简单的搜索任务,我们可以使用 Django Mode ...

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

    如何在MySQL中获得更好的全文搜索结果 很多互联网应用程序都提供了全文搜索功能,用户可以使用一个词或者词语片断作为查询项目来定位匹配的记录.在后台,这些程序使用在一个SELECT 查询中的LIKE语 ...

  4. window环境下,php+sphinx+coreseek实现简单的中文全文搜索

    就以我个人理解来说,sphinx其实是介于客户端和mysql之间的一个索引表,把数据库的没一条记录假设为文档,那么这个索引表其实保存的就是这条记录的关键词及其对应的文档id 1.sphinx的安装 下 ...

  5. SQLSERVER全文搜索

    SQLSERVER全文搜索 看这篇文章之前请先看一下下面我摘抄的全文搜索的MSDN资料,基本上MSDN上关于全文搜索的资料的我都copy下来了 并且非常认真地阅读和试验了一次,并且补充了一些SQL语句 ...

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

    全文搜索(Full Text Search) 现在我们已经讨论了搜索结构化数据的一些简单用例,是时候开始探索全文搜索了 - 如何在全文字段中搜索来找到最相关的文档. 对于全文搜索而言,最重要的两个方面 ...

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

    背景:搞个个人博客的全文搜索得用like啥的,现在mysql版本号已经大于5.6.4了也就支持了innodb的全文搜索了,刚查了下目前版本号都到MySQL Community Server 5.6.1 ...

  8. MySQL 全文搜索支持

    MySQL 全文搜索支持 从MySQL 4.0以上 myisam引擎就支持了full text search 全文搜索,在一般的小网站或者blog上可以使用这个特性支持搜索. 那么怎么使用了,简单看看 ...

  9. Apache Solr采用Java开发、基于Lucene的全文搜索服务器

    http://docs.spring.io/spring-data/solr/ 首先介绍一下solr: Apache Solr (读音: SOLer) 是一个开源.高性能.采用Java开发.基于Luc ...

随机推荐

  1. Newly Setting up a CentOS-7 system

    yum install -y epel-release glibc.i686 libtools vim clang git autoconf automake w3m glibc screen the ...

  2. Android中自定义veiw使用Java中的回调方法

    //------------------MainActivity----中---------------------------------- import android.os.Bundle;imp ...

  3. html 7.29

    4.请判断以下说法是否正确:HTML 会被 XHTML 取代. 您的回答:错误 正确答案:正确 9.请判断以下说法是否正确:DOCTYPE 没有关闭标签. 您的回答:错误 正确答案:正确 13.下列哪 ...

  4. 解决IOS safari在input focus弹出输入法时不支持position fixed的问题

    该文章为转载 我们在做移动web应用的时候,常常习惯于使用position:fixed把一个input框作为提问或者搜索框固定在页面底部.但在IOS的safari和webview中,对position ...

  5. java 对象的上转型对象(父类)

    Example5_10.java class 类人猿 { void crySpeak(String s) { System.out.println(s); } } class People exten ...

  6. java 基础的几种算法

    1:冒泡排序:2个之间进行循环筛选   public void sort(int[] a) { int temp = 0; for (int i = a.length - 1; i > 0; i ...

  7. 使用DTM ( Dynamic Topic Models )进行主题演化实验

    最近想研究下Dynamic Topic Models(DTM),论文看了看,文科生的水平确实是看不懂,那就实验一下吧,正好Blei的主页上也提供了相应的C++工具, http://www.cs.pri ...

  8. jsp导入外部样式

    在博客园遇到一位朋友,她将我的代码下载下去,运行的时候,jsp页面的样式不存在,不会显示出来. 这里就将我之前写的SpringSpringmvcMybatis做一些修改. jdk1.8 加入了两个ja ...

  9. Android如何使用API

    转自:http://www.cnblogs.com/vanezkw/archive/2012/07/03/2574559.html 本文针对Android开发如何使用API文档进行一些经验分享. 1. ...

  10. 性能更好的js动画实现方式---requestAnimationFrame

    用js来实现动画,我们一般是借助setTimeout或setInterval这两个函数,css3动画出来后,我们又可以使用css3来实现动画了,而且性能和流畅度也得到了很大的提升.但是css3动画还是 ...