搜索服务之离线处理思路

为完善展示搜索服务离线处理思路,现在编写三个简单的文档以作示范

1.html->中华人民共和国
2.html->中华人民共和国湖南省
3.html->中华人民共和国湖南省株洲市
 
现对1.html  2.html  3.html搜索,思路如下
 
一、网页信息的提取与存储
通过抓取1.html  2.html  3.html三个网页内容,用正则提取内容,形成格式化内容
文件格式:url_content
如:(test.txt)
1.html_中华人民共和国
2.html_中华人民共和国湖南省
3.html_中华人民共和国湖南省株洲市
 
二、清理数据,为建立倒排文件准备
Map(key,value)->{key:url value:content}  如:key->1.html  value->中华人民共和国
Partition(key,value)->{将相同的key汇集至同一个Reduce}
Reduce(key,List<value>)->{如果一个key有多个value,说明有重复抓取,只取一个即可}
最成形最终源文件oktest.txt
文件格式:url_content
1.html_中华人民共和国
2.html_中华人民共和国湖南省
3.html_中华人民共和国湖南省株洲市
 
三、建立倒排文件
1.分词
Map(key,value)->{key:url value:content}  如:key->1.html  value->中华人民共和国
对Content分词,计算出RANK,根据索引词集合向Reduct发射K次
设:value分词所有的索引词集合为A{中华,人民,共和国}
foreach(var a in A)
{
     Map(key,value)->{key:a  value:url} 如:(key->中华 value:1.html)   (key->人民 value->1.html)  (key->共和国 value:1.html)
}
Partition(key,value)->{将相同的key汇集至同一个Reduce,key->索引词 value->url}
Reduce(key,List<value>)->{如果一个key有多个value,说明这个索引词出现在多个文档里}
 最成形最终源文件okorder.txt
文件格式:索引词_url   (实际会有更多的信息如RANK)
中华_1.html_2.html_3.html
人民_1.html_2.html_3.html
共和国_1.html_2.html_3.html
湖南省_2.html_3.html
湖南_2.html_3.html
株洲_3.html
株洲市_3.html
 
四、建立二级索引
 由于倒排文件过大,为提升查询速率,可以建立二级索引,具体如下
<1.将倒排文件按约定(如取余)拆分成几个文件
Partition(key,value)->{key:索引词 value:line(倒排文件记录)}
{
  key=key%num
  return <key,value>
}
Reduce(key,value)->{key:索引词 value:line(倒排文件记录)}----相同取余分在一个子文件里
如:
okorder1.txt
中华_1.html_2.html_3.html
人民_1.html_2.html_3.html
共和国_1.html_2.html_3.html
okorder2.txt
湖南省_2.html_3.html
湖南_2.html_3.html
okorder3.txt
株洲_3.html
株洲市_3.html
 
根据映射关系形成最终的二级索引文件okindex.txt
格式:索引词_文件号
中华_okorder1.txt
人民_okorder1.txt
共和国_okorder1.txt
湖南省_okorder2.txt
湖南_okorder2.txt
株洲_okrder3.txt
株洲市_okorder3.txt
 
五、搜索过程
若搜索"中华人民"->拆分"中华","人民"索引词->查找二级索引文件(得出okorder1.txt)->搜索okorder1.txt(得出:
中华_1.html_2.html_3.html
人民_1.html_2.html_3.html)->返回查询结果(1.html,2.html,3.html)
原文地址:https://www.cnblogs.com/bobsoft/p/3545375.html