互联网的海量数据信息,使得通用搜索引擎提供给用户的不相关信息太多,垂直搜索引擎专门针对某一类主题信息,以避免通用搜索引擎带来的“噪音”。

垂直搜索引擎通常由四个部分组成:信息采集模块、索引模块、查询模块和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、相关搜索

相关词汇推荐。