基于boost文档的小型搜索引擎

基于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中的数据分析然后制作成正排和倒排索引文件。
    在这里插入图片描述
发布了221 篇原创文章 · 获赞 200 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/hansionz/article/details/86634519