基于boost文档的小型搜索引擎
项目背景: 在使用boost的官方网站去查询一些知识的时候,发现该网站没有搜索框,我们不能很快速的定位到锁需要的文档,所以基于这个背景实现了一个简单的boost文档搜索框。
项目模块及每个模块的功能:
- 索引模块
- 搜索服务器
- CGI客户端
- HTTP服务器(采用CGI程序进行程序替换)
模块构图:
项目的核心流程:
- 浏览器访问HTTP服务器获取到主页的html页面
- 客户输出关键字进行查询
- 浏览器发送给http服务器一个GET请求,该请求包含了一个query参数将关键词发送给HTTP服务器
- HTTP服务器收到该请求后,将query参数解析出来,然后通过CGI程序包装成一个TCP报文发给搜索服务器
- 搜索服务器收到该报文后,进行检索,得出查询结果,包括标题、摘要、show_url和跳转url,然后响应给CGI客户端
- CGI程序将根据搜索服务器的响应,将该数据封装成html然后返回给浏览器
搜索服务器检索流程:
- 搜索服务器首先对query参数(检索词)进行分词,使用结巴分词(cpppjieba)完成
- 然后搜索服务器对分词的每一个结果进行触发,这里主要通过倒排索引实现,我们可以得到每个分词对应的倒排拉链
- 针对触发的文档结果,按照权重进行排序。排序主要根据该词出现的位置以及该词出现的频率。
- 根据排序后的id列表,从正排索引正获取到对应的数据,然后封装成TCP响应返回给CGI客户端
关于倒排索引和正排索引:
一个例子说明倒排索引和正排索引:
文档id | 正文 |
---|---|
1 | 乔布斯/发布/了/苹果/手机 |
2 | 乔布斯/买/了/四斤/苹果 |
正派索引: 就是直接根据文档的id找到正文
倒排索引: 更具分词结果找到对应Id
key | 文档id |
---|---|
乔布斯 | 1、2 |
发布 | 1 |
买 | 2 |
苹果 | 1、2 |
四斤 | 2 |
手机 | 1 |
苹果手机 | 1 |
索引模块核心流程:(本项目重点)
-
实现一个索引制作程序,输入的是boost库中的所有html文档,输出的是将正排和倒排的索引文件存入到磁盘中,后边由搜索服务器加载到内存中搜索。
为什么不使用数据库中的select…like呢?
答:因为数据库的数据是存储在磁盘上的,该语句是直接在磁盘上进行检索,而不是在内存中, 它的速度和在内存中查询的速度是数量级的差距。 -
实现一个索引反解工具,该程序输入的是索引文件,输出是把索引文件中的内容更加格式化的输出,方便肉眼观察和测试
-
封装一个静态库,将和索引相关的核心操作都放到静态库中
索引制作的流程:
- 首先对拿到的所有boos文档的html进行去标签,
这部分是参考网上的代码(python)
。去标签之后,将每一个html组织成一个三元组,包括title、跳转url和正文,将他们按照特殊字符\3
分割开,每个html文档占一行,然后存储到raw_input
文件中。 - 读取分析raw_input中的数据分析然后制作成正排和倒排索引文件。