- 提取每个页面的关键字,主要思路,因为p列族下的t列数据不是很准确
- 这里可以使用每个页面入链接标签中的内容作为每个页面的主题内容即为关键字,即 把拔取下来的数据html中的< a> xxxx< /a> 的xxx作为搜索的关键字。
代码如下:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102import 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算法内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复