搜索引擎项目
一. 项目介绍
1. 基本思路:
模拟百度搜索的方式实现站内搜索引擎,整个项目分为两大部分,HTTP服务器和搜索服务器:
HTTP服务器的功能就是接受用户数据,显示索引结果
搜索服务器分为客户端和服务器端,客户端来负责提取有用的信息,服务器端来进行检索
2. 模块划分
整体分为4个模块:
- HTTP服务器
- 搜索客户端(CGI程序)
- 搜索服务器(RPC框架)
- 索引模块(核心数据结构)
3. 核心流程
HTTP服务器获取用户的请求并处理,将数据传给CGI程序。
CGI程序提取数据获取有用的信息(query),提交到搜索服务器端
搜索服务器端处理信息进行检索操作,把结果反馈给CGI程序
CGI程序将检索结果进行html格式化后,发送给HTTP服务器
HTTP服务器收到结果将其打印到页面上
4. 搜索服务器的核心流程
对请求进行解析
对查询次进行分词 (cppjieba分词)
根据每个分词结果 ,查找包含相应网页内容的文件id
将找到的所有结果进行排序(文件id集合)
根据对应的文件id,获取相应网站信息
构造响应,传回HTTP服务器
5. 流程图
二. 项目特点
使用到Google提供的 protobuf, gflag, glog 等开源框架来完成开发
搜索服务器利用RPC协议,基于百度开源的高性能RPC框架 sofa-pbrpc 实现
搜索原理是以正排索引加倒排索引相结合的方式进行检索
HTTP服务器以CGI的方式调用搜索客户端完成搜索功能
HTTP服务器使用epoll模型,提高了并发的响应速度
三. 项目的具体实现
这里只介绍搜索服务器有关的实现,对于http服务器请查看:基于CGI协议的HTTP服务器项目
搜索服务器
1. 索引模块核心结构的定义
实现一个搜索引擎,必须要考虑到的问题有:怎么存放数据?怎么传输数据?怎么进行检索?
首先关于存放数据:我们就要为其定义一个较为完整的结构,这个结构包括了文件的id号(我们为了方便数据的检索,为每一个获取到的文件进行编号),文件的标题,文件的正文,文件的url(我们要进行网页搜索)
传输数据并不是简单的在同一台主机上进行,而是在网络上不同主机间进行,需要数据的序列化与反序列化,我们得为此构建一个较为健全的序列化方法。
信息的检索不能使用地毯式查找的方法,数据是非常大的,其效率及其低下。我们想的是能够通过关键词直接找到对应的文件标号,根据文件标号获取的响应的文件信息,这就使用到了正排索引+倒排索引的方式,正排结构中存放文件标号及其对应的文件信息,倒排结构中存放关键字及其该关键字对应的所有文件id;之后我们便可以以查倒排,找正排的方式进行信息的获取。
综合上述问题,我们决定使用google提供的 protobuf 序列化开源框架来实现,protobuf具有
- 高效的解析速度
- 小巧的传输体积
- 直接上手,简单易用
的特点,非常适合我们来对数据的管理,即对信息的传输,很好的满足了我们的需求,还有一个重要的特点,这个protobuf是C++实现的,我们这个项目也是一个C++项目,也就不存在什么兼容性的问题了。
关于protobuf来构建索引的核心结构,可以参考:利用 Google Protobuf 构建索引核心结构
2. 索引模块的构建
bool Index::Build(const std::string& input_path)
{
// 1.按读取文件内容,针对每一行的数据进行处理
// 构建正排索引,同时根据 DocI