互联网的海量数据信息,使得通用搜索引擎提供给用户的不相关信息太多,垂直搜索引擎专门针对某一类主题信息,以避免通用搜索引擎带来的“噪音”。
垂直搜索引擎通常由四个部分组成:信息采集模块、索引模块、查询模块和UI模块组成,换句话说即爬虫、索引、查询和web界面。
一、爬虫
1、配置
指定URL初始列表、爬取深度、抓取范围(主题相关即指定域名前缀)。
指定并行抓取数、抓取周期
2、抓取
从初始URL开始,广度优先遍历,结合爬取深度和主题相关过滤。
判断URL是否已经抓取,避免重新下载相同页面。
并行抓取URL(MultiCurl),缓存常用域名与IP对应关系,减少域名解析次数。
3、存储
以URL为KEY存储网页内容到原始网页库(LevelDB)。
4、解析
解析下载页面(HtmlCxx),包括标题(title)、超链接(href)、内容(文本内容最长,但要注意刨除脚本代码即标签<script>和</script>之间,,脚本代码与文本相似,程序无法区分)此外,KeyWord、字体标记(大字体、加粗)对关键字的提取很重要。
需要注意页面编码问题,通过<meta>标签获取编码方式,如果编码设置错误,页面文本内容可能会是乱码
根据指定URL前缀来过滤超链接,剩下的再去重后添加URL到等待下载队列,保证爬虫的资源自我发现能力.需要注意相对URL链接问题。
二、索引
1、词库
手工建词库+基于词频统计更新词库。一级词库用于词库管理,二级词库真正用于分词。
2、分词
分词采用词库分词和统计分词相结合,词库分词的优点在于切分速度快、效率高,统计分词的优点在于收录新词(未登录词)。
(1)词库分词
分词算法采用正向最大匹配算法,即以词库为基准,从前往后正向扫描标题或者正文字符串,对扫描的每个词,从词库中寻找最长匹配。
假设S=C1C2C3C4,最大正向匹配算法描述如下:
(A)取一个字C1,在词库中查找C1并保存是否成词标记
(B)再取字C2,判断词库中是否有以C1C2为前缀的词
(C)不存在,则C1为单词,一次分词结束
(D)存在,判断C1C2是否为词,并取以C1C2为首的多个词的个数n
(E)如果n为0则一次分词结束
(F)否则再取一字,判断词库中是否有以C1C2C3为前缀的词
(G)若不存在,则返回最近一次能够成词的C1C2
(H)否则转向6
(I)从字C3开始下一次分词
假设标题为“我是中华人民共和国公民”,词库中有“中华人民共和国”、“中华”、“人民”、“共和国”、“公民”等词,则当扫描到“中”字,就从“中”字开始向后分别取1、2、3……8个字(“中”、“中华”、“中华人”、“中华人民”、“中华人民共”、“中华人民共和”、“中华人民共和国”、“中华人民共和国公”),词表中的最长匹配字符串就是“中华人民共和国”,那么就此切分开,扫描器推进到“公”字,进行下一轮分词。
(2)统计分词
通常词是稳定的字的组合,根据n元语法,字与字相邻同时出现的频率或概率能够较好的反映成词的可信度,即频率越多就越可能是固定的词,简单的例子是统计两个字之间相邻的频率,频率大于某个阈值就认为这两个字组成了一个新词。需要注意的是:这、的、啊之类的词,以滤掉对搜索无用的词组。
3、打分
对文档重要性打分用于检索时排序。
PageRank和HITS。
4、倒排
以Value为Key,检索URL为倒排。
注:以URL为Key,以分词得到的多个关键字为Value,建立的索引为正排索引。
三、检索
1、查询
根据关键词检索文档索引库。
对返回的文档去重。
根据文档打分结果进行排序。
反馈排序后结果给用户。
2、反馈
根据排序后结果渲染反馈:
(1)展现反馈
对整个结果展现反馈一次,参数包括QueryID、PvTime、KeyWord。
(2)点击反馈
搜索结果每次点击记录一次,参数包括QueryID、PvTime、KeyWord、DestinationURL。
四、WebUI
1、搜索框
输入搜索词,提示相关词汇。
2、结果集
分页显示、搜索时长、相关结果集总数。
Table显示每个分页的结果集。
结果记录由标题、链接、摘要、快照组成。高亮显示关键词。
3、相关搜索
相关词汇推荐。