基于pagerank算法的运用Hbase的搜索引擎(2)——获得关键字篇

  • 提取每个页面的关键字,主要思路,因为p列族下的t列数据不是很准确
  • 这里可以使用每个页面入链接标签中的内容作为每个页面的主题内容即为关键字,即 把拔取下来的数据html中的< a> xxxx< /a> 的xxx作为搜索的关键字。
代码如下:
import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.NavigableMap;
import java.util.Set;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;
import org.apache.hadoop.hbase.mapreduce.TableMapper;
import org.apache.hadoop.hbase.mapreduce.TableReducer;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
import org.apache.log4j.PropertyConfigurator;

/**
 * 提取每个页面的关键字,主要思路,因为p列族下的t列数据不是很准确
 * 这里可以使用每个页面入链接标签中的内容作为每个页面的主题内容即为关键字
 * */
public class GetKeyWordMR  extends Configured implements Tool {
	public static void main(String[] args) throws  Exception {
        ToolRunner.run(new GetKeyWordMR(),args);
    }

    @Override
    public int run(String[] strings) throws Exception {
        //PropertyConfigurator.configure("/Users/angelia/IdeaProjects/code2019/searchProject/src/main/resources/log4j.properties");
        Configuration configuration=getConf();
        configuration.set("hbase.zookeeper.quorum","hadoopPD:2181");
        Job job=Job.getInstance(configuration);
        job.setJobName(GetKeyWordMR.class.getName());
        job.setJarByClass(GetKeyWordMR.class);
        TableMapReduceUtil.initTableMapperJob(
                Bytes.toBytes(configuration.get("table")),
                new Scan(),
                KeyWordMapper.class,
                Text.class,
                Text.class,
                job);
        TableMapReduceUtil.initTableReducerJob(
        		configuration.get("table"), KeyWordReducer.class,job
        );
        job.waitForCompletion(true);
        return 0;
    }

    /**
     * 提取每个页面的关键字
     * 可以利用算法分析内容
     * 简单提取:网页的关键字通过入链的超链接标签中的字符内容 以及当前网页中 title 来确定
     * */
    public static  class KeyWordMapper extends TableMapper<Text, Text> {
        @Override
        protected void map(ImmutableBytesWritable key, Result value, Context context) throws IOException, InterruptedException {
        	
        	String k = Bytes.toString(key.get());
            //拿到 il列族下的所有 列 和 值组成的map
            NavigableMap<byte[], byte[]> qvs = value.getFamilyMap(Bytes.toBytes("il"));
            //拿到当前页面的title值
            byte[] title = value.getValue(Bytes.toBytes("page"), Bytes.toBytes("t"));
            //如果 map长度大于0代表该页面有入链
            if(qvs.size() > 0){
                Set<Map.Entry<byte[], byte[]>> qvset = qvs.entrySet();
                //拿到第一个入链的 内容 作为基础值
                byte[] v = qvs.firstEntry().getValue();
                //遍历所有的入链内容,把第一个非空值作为 keyword
                for (Map.Entry<byte[], byte[]> e : qvset) {
                    v = e.getValue();
                    if(v.length > 0){
                        break;
                    }
                }
                // 把入链内容和title共同作为关键字
                if(title != null){
                    context.write(new Text(k),new Text(Bytes.toString(v)
                            +"\t"+Bytes.toString(title)));
                }else {
                    context.write(new Text(k), new Text(Bytes.toString(v)));
                }
            }
        	
        }
    }

    public static class KeyWordReducer extends TableReducer<Text,Text, NullWritable>{
    	@Override
        protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
            Put put = new Put(Bytes.toBytes(key.toString()));
            for (Text value : values) {
                put.addColumn(Bytes.toBytes("page"),Bytes.toBytes("key"),Bytes.toBytes(value.toString()));
            }
            context.write(NullWritable.get(),put);
        }
    }

}

发布了20 篇原创文章 · 获赞 0 · 访问量 253

猜你喜欢

转载自blog.csdn.net/weixin_43570155/article/details/103733163