概述
- 提取每个页面的关键字,主要思路,因为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);
}
}
}
最后
以上就是高大星星为你收集整理的基于pagerank算法的运用Hbase的搜索引擎(2)——获得关键字篇的全部内容,希望文章能够帮你解决基于pagerank算法的运用Hbase的搜索引擎(2)——获得关键字篇所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复