基于boost库的搜索引擎项目
搜索引擎项目
功能
- 实现了一个基于boost 文档的搜索引擎,用户输入查询词,能够把和这个词相关的文档的网页都查找出来,类似于百度搜索。
模块化介绍
分为三大模块
数据处理模块:对待搜索的网页进行预处理
索引模块:根据数据处理模块的结果,构造出正排索引和倒排索引。
搜索模块:根据用户输入的查询词,对索引进行查找,最终找出那些文档和这个词有关系。
一:数据处理模块详解
- 实现
- 输入:boost 文档中对应的html 文件
- 输出:去掉标签之后的结果
- 拿到boost 文档后,我们发现这些文档中,包含了 html 文件、图片文件还有一些目录。而我们要做的是保留 html 文档,去掉其他的所有文件。
- 这个过程中我用到了boost库中filesystem 库(文件系统操作库),将我的所有html 文档路径存到一个vector 中。
- 这个过程中我用到了boost库中filesystem 库(文件系统操作库),将我的所有html 文档路径存到一个vector 中。
- 拿到这些文档路径后,打开文件,读取文件内容,对html 文档进行解析,分别解析出标题、正文、URL。
- 标题:< title >标题< /title>
- 正文:除了标签之外的东西,都是正文。
- URL:boost 官网url 前面部分+我的文件路径的一部分即可。
- 标题:< title >标题< /title>
- 将解析好的标题、正文、URL 输出到一个行文本文件中,这个文件每一行对应一个html 文档,中间使用特殊字符当做分隔符进行分割。分隔符必须是正文标题url 不会出现的字符,于是我选择了ASCII 中的已经被弃用的字符 ‘\3’ 。
至此,数据处理模块结束
二:索引模块详解
- 实现:根据数据处理的结果,构建正排索引和倒排索引。
- 正排索引:给定编号,就能获取到文档内容
- 倒排索引:给定一个词,就能获取到这个词和那些文档有关联
- 构造一个结构体 DocInfo,这个结构体中有 文档编号、文档的标题、正文、URL。
- 构造一个机构体 Weight,这个结构体中有 给定词、文档编号、词的权重。
- 构建正排索引的容器是vector,vector里面是 DocInfo 结构体,使用下标作为文档的i编号id。
- 构建倒排索引的容器是 unordered_map,其中 K 是给定词(string),V是vector 中套一个Weight结构体;因为一个词可能会出现在多个文档中。
- 拿到行文本中的每一行,进行切分,放到我正排索引的容器 vector 中。在切分的字符串时,用到boost库中split 函数。
- 将每一行切分出来的标题和正文进行分词,(使用 jieba 分词第三方库),将分词结果存储在 vector< string> 中。
- 对DocInfo 中的标题和正文进行词频统计,当前词在标题中出现几次,在正文中出现几次,定义一个 unordered_map ,K 是给定词,V 是WordCnt 结构体,结构体里面有标题的词频和正文的词频。
- 这里会有一个问题,就是查询的过程中是不区分大小写的,因此我们在处理的时候将所有的词都化作小写来处理。我们使用boost 库中的 to_lower 函数进行大写转小写。
- 将分词结果放到我构建的倒排索引的容器 unordered_map 中。
- 如果该词在倒排索引中不存在,就构建新的键值对。
- 如果该词在倒排索引中存在,就找到对应的 vector ,构建新的 Weight 对象插入到 vector 中。其中标题词频和正文词频占不同的权重。
搜索模块详解介绍
- 实现:根据用户输入的查询词,对索引进行查找,最终找出那些文档和这个词有关。
- 对查询词进行分词
- 针对每个分词结果查找倒排索引,找出那些文档具有相关性。
- 这块有一个问题:如果不同的分词对应相同的文档id 的话,需要去重,并且进行权重合并。
- 我们只需要在排序的时候,首先根据 id 进行排序,把相邻的相同 id 的权重合并,并且只保留一个 id 。再以权重进行排序即可。
- 按照词出现的频率进行降序排序
- 构建返回结果:根据得到的ID 列表,查找正排索引得到搜索结果。
- 在得到搜索结果后,使用 jsoncpp 这个库,将结果转换成 json 串发送给浏览器客户端,当然不会把所有的正文都发送过去,只是将出现该词的那一段发过去。
至此,搜索引擎所有的功能已完成,现在需要搭载在HTTP 服务器上,进行服务端和客户端的交互。
HTTP 模块
- 这个模块我暂时调用的是第三方库 htttplib 库,直接模拟 HTTP 服务器,搭载我要查询的内容发给自己的服务器,然后我自己的服务器又返回 JSON 串数据在浏览器客户端。
- emmmmmm,前端的知识还没有学,所以没有很丑很丑的页面。后期会补上的。
源码地址:https://github.com/zhangyi-13572252156/search_engine
基于boost库的搜索引擎项目相关推荐
- 基于boost库的搜索引擎
文章目录 一.项目介绍 二.搜索引擎相关的宏观原理 三.搜索引擎技术栈和项目环境 四.正排索引vs倒排索引-搜索引擎的具体原理 五.编写数据去标签与数据清洗的模块Parser 1.下载数据源 2.建立 ...
- 简单解析C++基于Boost库实现命令行
Boost库中默认自带了一个功能强大的命令行参数解析器,以往我都是自己实现参数解析的,今天偶尔发现这个好东西,就来总结一下参数解析的基本用法,该库需要引入program_options.hpp头文件, ...
- dio设置自定义post请求_基于dio库封装flutter项目的标准网络框架
网络框架是每个应用的基石,封装一个好的网络框架不仅是项目的一个好的开始,并且直接影响到随后项目的稳定性和可扩展性.在移动开发的各个端都有非常赞的网络请求基础框架,比如Android的okhttp库.s ...
- 基于Pyinstaller库将Python项目包括 图片打包exe方法,本人已经实践多次
基于Pyinstaller库将Python项目包括 图片打包exe方法,本人已经实践多次 文章目录 基于Pyinstaller库将Python项目包括 图片打包exe方法,本人已经实践多次 一.前言 ...
- 基于boost库的站内搜索引擎
文章目录 项目整体展示 一.项目的背景 二.项目的宏观原理 三.技术栈和环境 四.正排索引和倒排索引原理 五.数据预处理模块 Parser 5.1 去标签和数据清洗 5.2 parser代码编写 5. ...
- 【项目】 基于BOOST的站内搜索引擎
目录 1. 简介 建立搜索引擎的宏观体系 技术栈和项目环境 正排索引 and 倒排索引 2. 数据去标签与数据清洗模块 -- Parser 数据去标签 parser.cc parser.cc 的代码结 ...
- 用C++来设计开发的基于boost文档的站内搜索引擎项目,点赞收藏起来!
So Easy搜索引擎 项目描述 主要技术 项目特点 0. 准备工作 1. 预处理模块 2. 索引模块 3. 搜索模块 4. 服务器模块 项目难点和提升 结束语 项目描述 boost官网虽然提供了在线 ...
- C++项目:基于boost在线文档实现的搜索引擎(二)
C++项目:基于boost在线文档实现的搜索引擎(二) 索引模块 索引模块的描述 正排索引与倒排索引的建立 正排索引 倒排索引 jieba分词,正排查找,倒排查找 jieba分词 索引查找 索引的测试 ...
- 【C++项目】boost搜索引擎项目
文章目录 项目的gitee地址 项目基本演示 讲解思路 一:项目相关背景 二:搜索引擎的相关宏观原理 三:搜索引擎技术栈和项目环境 四:正排索引 vs 倒排索引 - 搜索引擎具体原理 五:编写数据去标 ...
- Boost搜索引擎项目
目录 1.项目相关背景 2.搜索引擎的相关宏观原理 3.搜索引擎技术栈和项目环境 4.正排索引 && 倒排索引--搜索引擎原理 5.编写数据去标签与数据清洗的模块 -- parser. ...
最新文章
- xxl-job Vs ElasticJob,谁牛?
- python链表的创建_Python——新建链表
- 理解和配置Out of memory: Kill process
- [C++] 井字棋游戏源码
- 微前端在网易七鱼的实践
- linux如何用rz上传文件,Linux使用rz命令上传文件
- Miner3D 数据分析软件
- django 传递中文_如何在Django中建立消息传递状态
- airpodspro窃听模式_AirPods Pro实时收听怎么关闭? AirPods Pro实时收听的使用方法
- 嘴上说着喜爱Java 9 ,身体却诚实地拥抱了Java 8
- Python 手写数字识别实战分享
- 典型计算机控制系统硬件组成框图,计算机控制技术重要.docx
- knockoutjs介绍
- VsCode必备插件
- 85 缓存, 验证码 序列化
- CRMEB Min电商系统商城源码 v4.3.2
- Firemonkey下使用StyleBook的一些经验
- 阿里飞猪个性化推荐:召回篇
- 建议直接收藏,阿里巴巴开源15个顶级Java项目
- 【linux内核分析与应用-陈莉君】时钟中断机制
热门文章
- 大师兄科研网_拜托啦,师兄!
- linux怎样判断线程是否暂停_怎样寻找合适的创业项目?如何判断一个创业项目是否靠谱?...
- ImageJ Nikon_如何用ImageJ进行粒度分析
- PS使用:windows解决Adobe Photoshop 2020(PS2020)闪退
- CSS:布局——圣杯布局和双飞翼布局
- php居中函数,PHP实现的自定义图像居中裁剪函数示例
- Spark、Strom、Flink和Beam的技术选型
- 如何使用文件的fseek函数对文件指针进行操作
- 全局拉普拉斯平滑之(1)Strucutre extraction from texture via relative total variation及稀疏矩阵求解
- Ubuntu安装Tensorflow及anaconda环境下使用TensorFlow