整体思路
- 访问网址,进入首页,输入搜索内容。
- HTTP服务器接收到HTTP响应,解析取出其中的搜索内容。
- 将搜索内容传输给CGI程序,既搜索客户端。
- 由搜索客户端将搜索内容构造成一个请求,发送给搜索服务器。
- 搜索服务器将请求解析,将搜索内容进行分词和查询。
- 将搜索内容的分词结果进行倒排查询并排序。
- 将倒排查询到到的数据进行正排查询,查询到每个文章的内容。
- 将结果进行封装,使之构成一个网页。
- 由HTTP服务器将构成的网页加载到响应中,并发送回浏览器。
- 重复发送请求既可完成搜索服务。
效果图
关键步骤
安装
使用的第三方库Google gflags、Google glog、Google ProtoBuf、Google Ctemplate直接使用安装三部曲./configure
,make
,make install
即可,cppjieba直接下载源码,比较麻烦的就是sofa-pbrpc的安装。
获取网页内容
使用爬虫进行一个简单的单机单网站的获取即可,
- 分析网站的层次,理清整个网站的目录树结构。
- 确定自己的初始节点,将其作为一个源网址。
- 分析主页面的HTML源码,根据特征提取出需要的子网页的URL。
- 进行子网页的自动获取,可以根据特征,提取出需要的部分内容。
- 将提取的内容存储在与网页相同的目录结构中。方便再次进行内容的提取。
构建索引
- 将网页内容进行去标签操作,并将所有文件数据按行或某种规则存储在一个文件缓存文件
- 设计正排索引和倒排索引的数据结构,正排索引既对应于每个文章的标识数据结构,一般包括每个文章的唯一标识符,标题,概括信息,URL等,倒排索引既每个关键词在哪个文章,并且在文章中的权重等信息。
- 循环的将每个文章的内容进行分析,并将文件数据别存入正排索引和倒排索引的对应字段中,在这个过程中需要正确的使用Google ProtoBuf,了解protobuf对命名空间,字段值的设置,字段值的查询等基本操作。
- 最后将构建好的正排索引和倒排索引进行序列化并存入文件中,方便使用时加载索引。
搭建HTTP服务器
- 创建socket套接字,将套接字进行端口绑定,并进入监听模式。
- 接收到HTTP请求之后,进行方法,URL,参数等内容的解析和提取,根据这些内容来判断是否是一个正确的请求。
- 判断是一个正确的请求之后将参数设置到环境变量中,并进行CGI程序替换。
- 当CGI程序执行结束之后,将结果封装成一个HTTP响应,将响应发送给浏览器,完成一次搜索,重复执行即可实现一个搜索功能。
搭建搜索客户端和搜索服务器
- 搜索客户端和服务器通过sofa-pbrpc框架进行搭建。
- 使用protobuf进行数据传输请求和响应的结构的设计,主要包括一个唯一标识符,内容,还可以有长度,数据类型等属性。同时进行rpc通信约定的注册。
- 根据客户端和服务器端的功能进行程序的设计。
- 客户端包括读取HTTP请求的参数,构造搜索请求,接收搜索响应,封装HTTP响应等功能。
- 服务器端包括建立监听,解析搜索请求,参数分词,加载索引,搜索索引,封装搜索响应,发送搜索响应等功能。
总结
- 掌握了多个第三方库的基本使用,正确使用第三方库是一个十分重要的基础,了解其基本原理也拓展我们的知识。
- 了解rpc的基本概念,rpc和http的区别,了解http和rpc的优缺点及适用场景。
- 了解了搜索引擎的基本雏形,根据和github上的其他搜索引擎进行比较,总结出网页获取有更加贴合实际情况的方法。
- 搜索关键词和文章的关联程度的计算方法,也是一个比较复杂的方面。