我的SOSO

1. 项目介绍

1.1项目简介

boost-C++LIBRARIES是C++的第三方库,boost库是一个非常强大剽悍的库。在C++未来的发展趋势中,我认为boost可能会加入到C++的标准库中,但是boost网站没有搜索文档的这个功能,因此做个项目。这个项目是一个基本boost文档的搜索引擎,当用户输入一个查询词时,把这个关键词的相关文档网页查找出来,已达到搜索文档的目的。
点击上面的Boost SOSO就可以进入搜索引擎的界面。
GitHub源码

1.2 模板

在实现搜索引擎之前,以百度为例,展示出来的界面,应有标题、摘要、URL
在这里插入图片描述

2. 项目的实现

2.1 项目的组织结构

项目的实现结构总共分为三个模块:

数据处理模块:对待搜索的网页进行预处理对html进行去标签处理。

索引模块:根据数据处理模块的结果,构造正排索引和倒排索引。

搜索模块:根据输入的查询词对索引进行查找文档id,通过文档id找出文档,即就是从倒排索引,找到倒排索引。

2.2 数据处理模块

数据处理模块,是对源html文档,进行去标签处理,分析出标题、正文、URL。

对存储源html文档的目录进行遍历,枚举出所有的html文档路径,然后保存在vector中。
遍历vector,依次处理每个枚举出的文档,对文档进行分析,分析出标题/正文/url,并且去标签。
把分析的结果按照一行的形式写入到输出文件raw_inout中。

主要实现是对文档的解析,如第一个about.html文档。对其解析:

在这里插入图片描述

  1. 首先是标题:标题的形式是 <title>标题</title>,于是找< title>/标题</ title>之间的字符串就是标题。
  2. 然后是正文:除标签之外的都是正文,即一对<>之外的字符串都是正文,于是如果是<就是标签的开始,如果是>就是标题的结束,中间的字符串舍弃
  3. 接下来就是URL:我是以boost1_70版本的,所以以https://www.boost.org/doc/libs/1_70_0/libs/filesystem/doc/index.htm为例可以发现,doc后面就是路径+html文档。于是string prefix = "https://www.boost.org/doc/libs/1_70_0/doc/" + 文档名。

最后分析完成之后,需要把分析的结果按照一行的形式写入到输出文件中,为了区分标题,正文,URL,于是在其中间加上’\3’。
string line = info.title + "\3" + info.url + "\3" + info.content + "\n"

2.3 索引模块

这是最难的一个模块,首先介绍一下分词正排索引和倒排索引。

2.3.1 正排索引

在这里插入图片描述于是正排所以就是为了给定编号,获取相应文档。

2.3.2 倒排索引

反之倒排索引就是根据关键词找文档编号。如:
在这里插入图片描述
对于上面关键词,当收到后,就会找到对应的文档编号。

2.3.3 构建索引

现在来到比较难做的构建索引。
1、正排索引的构建

  1. 按行读取每个文档。
  2. 对这行内容进行切分,依据为’\3’ 对读到的每一行构造DocInfo对象,插入到vector,即就是正排索引。
struct DocInfo
{
	uint64_t id;//文档id,以vector的下标为文档id
	std::string title;//文档标题
	std::string content;//文档正文
 	std::string url;//文档URL
};

2、倒排索引的构建

  1. 先对当前的docinfo进行分词,即就是对正文和标题分词
  2. 对分词结果进行进行词频统计,以结构体Weight记录
  3. 遍历分词结果,在倒排索引中查找,如果存在,找到对应的值(vector),构建新的Weight对象插入到vector中,如果不存在就构建新的键值对。
struct Weight
{
    	uint64_t doc_id;//文档id
    	int weight;//权重,为排序做准备,当前用词频计算权重
       std::string key;//关键词
};

最后没个词都有一个vector,这个vector里面存的就是,它在每个文档的权重,还有文档的编号。也就是这个词在这个文档当中出现了几次,当时权重的公式以一个粗暴的方式计算

#define EQ 20 /*权重公式(equal) : 标题词是正文词的20倍*/

weight.weight = EQ * word_pair.second.title_cnt + word_pair.second.content_cnt;

3、总揽
在这里插入图片描述

2.4 搜索模块

搜索模块相对简单,就四大部分

  1. 对输入的查询词进行分词
  2. 对分词结果查找倒排索引,找到相关文档id
  3. 根据权重排序
  4. 以jsoncpp格式构造结果,最后整体返回为一个字符串。

2.5 总览

在这里插入图片描述

3. 发布

目前已经部署到个人服务器上,由于限制带宽,所以第一次进入可能会有一些慢。
Boost SOSO

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值