搜索引擎项目

功能
  • 实现了一个基于boost 文档的搜索引擎,用户输入查询词,能够把和这个词相关的文档的网页都查找出来,类似于百度搜索。
模块化介绍
  • 分为三大模块

  • 数据处理模块:对待搜索的网页进行预处理

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

  • 搜索模块:根据用户输入的查询词,对索引进行查找,最终找出那些文档和这个词有关系。

一:数据处理模块详解

  • 实现

    • 输入:boost 文档中对应的html 文件
    • 输出:去掉标签之后的结果
  1. 拿到boost 文档后,我们发现这些文档中,包含了 html 文件、图片文件还有一些目录。而我们要做的是保留 html 文档,去掉其他的所有文件。

    • 这个过程中我用到了boost库中filesystem 库(文件系统操作库),将我的所有html 文档路径存到一个vector 中。
  2. 拿到这些文档路径后,打开文件,读取文件内容,对html 文档进行解析,分别解析出标题、正文、URL。
    • 标题:< title >标题< /title>
    • 正文:除了标签之外的东西,都是正文。
    • URL:boost 官网url 前面部分+我的文件路径的一部分即可。
  3. 将解析好的标题、正文、URL 输出到一个行文本文件中,这个文件每一行对应一个html 文档,中间使用特殊字符当做分隔符进行分割。分隔符必须是正文标题url 不会出现的字符,于是我选择了ASCII 中的已经被弃用的字符 ‘\3’ 。
    至此,数据处理模块结束

二:索引模块详解

  • 实现:根据数据处理的结果,构建正排索引和倒排索引。
  • 正排索引:给定编号,就能获取到文档内容
  • 倒排索引:给定一个词,就能获取到这个词和那些文档有关联
  1. 构造一个结构体 DocInfo,这个结构体中有 文档编号、文档的标题、正文、URL。
  2. 构造一个机构体 Weight,这个结构体中有 给定词、文档编号、词的权重。
  3. 构建正排索引的容器是vector,vector里面是 DocInfo 结构体,使用下标作为文档的i编号id。
  4. 构建倒排索引的容器是 unordered_map,其中 K 是给定词(string),V是vector 中套一个Weight结构体;因为一个词可能会出现在多个文档中。
  5. 拿到行文本中的每一行,进行切分,放到我正排索引的容器 vector 中。在切分的字符串时,用到boost库中split 函数。
  6. 将每一行切分出来的标题和正文进行分词,(使用 jieba 分词第三方库),将分词结果存储在 vector< string> 中。
  7. 对DocInfo 中的标题和正文进行词频统计,当前词在标题中出现几次,在正文中出现几次,定义一个 unordered_map ,K 是给定词,V 是WordCnt 结构体,结构体里面有标题的词频和正文的词频。

    • 这里会有一个问题,就是查询的过程中是不区分大小写的,因此我们在处理的时候将所有的词都化作小写来处理。我们使用boost 库中的 to_lower 函数进行大写转小写。
  8. 将分词结果放到我构建的倒排索引的容器 unordered_map 中。
    • 如果该词在倒排索引中不存在,就构建新的键值对。
    • 如果该词在倒排索引中存在,就找到对应的 vector ,构建新的 Weight 对象插入到 vector 中。其中标题词频和正文词频占不同的权重。

搜索模块详解介绍

  • 实现:根据用户输入的查询词,对索引进行查找,最终找出那些文档和这个词有关。
  1. 对查询词进行分词
  2. 针对每个分词结果查找倒排索引,找出那些文档具有相关性。
    • 这块有一个问题:如果不同的分词对应相同的文档id 的话,需要去重,并且进行权重合并。
    • 我们只需要在排序的时候,首先根据 id 进行排序,把相邻的相同 id 的权重合并,并且只保留一个 id 。再以权重进行排序即可。
  3. 按照词出现的频率进行降序排序
  4. 构建返回结果:根据得到的ID 列表,查找正排索引得到搜索结果。
    • 在得到搜索结果后,使用 jsoncpp 这个库,将结果转换成 json 串发送给浏览器客户端,当然不会把所有的正文都发送过去,只是将出现该词的那一段发过去。

至此,搜索引擎所有的功能已完成,现在需要搭载在HTTP 服务器上,进行服务端和客户端的交互。

HTTP 模块

  • 这个模块我暂时调用的是第三方库 htttplib 库,直接模拟 HTTP 服务器,搭载我要查询的内容发给自己的服务器,然后我自己的服务器又返回 JSON 串数据在浏览器客户端。
  • emmmmmm,前端的知识还没有学,所以没有很丑很丑的页面。后期会补上的。
源码地址:https://github.com/zhangyi-13572252156/search_engine

整个项目到这里就完了,后期还会更新。

基于boost库的搜索引擎项目相关推荐

  1. 基于boost库的搜索引擎

    文章目录 一.项目介绍 二.搜索引擎相关的宏观原理 三.搜索引擎技术栈和项目环境 四.正排索引vs倒排索引-搜索引擎的具体原理 五.编写数据去标签与数据清洗的模块Parser 1.下载数据源 2.建立 ...

  2. 简单解析C++基于Boost库实现命令行

    Boost库中默认自带了一个功能强大的命令行参数解析器,以往我都是自己实现参数解析的,今天偶尔发现这个好东西,就来总结一下参数解析的基本用法,该库需要引入program_options.hpp头文件, ...

  3. dio设置自定义post请求_基于dio库封装flutter项目的标准网络框架

    网络框架是每个应用的基石,封装一个好的网络框架不仅是项目的一个好的开始,并且直接影响到随后项目的稳定性和可扩展性.在移动开发的各个端都有非常赞的网络请求基础框架,比如Android的okhttp库.s ...

  4. 基于Pyinstaller库将Python项目包括 图片打包exe方法,本人已经实践多次

    基于Pyinstaller库将Python项目包括 图片打包exe方法,本人已经实践多次 文章目录 基于Pyinstaller库将Python项目包括 图片打包exe方法,本人已经实践多次 一.前言 ...

  5. 基于boost库的站内搜索引擎

    文章目录 项目整体展示 一.项目的背景 二.项目的宏观原理 三.技术栈和环境 四.正排索引和倒排索引原理 五.数据预处理模块 Parser 5.1 去标签和数据清洗 5.2 parser代码编写 5. ...

  6. 【项目】 基于BOOST的站内搜索引擎

    目录 1. 简介 建立搜索引擎的宏观体系 技术栈和项目环境 正排索引 and 倒排索引 2. 数据去标签与数据清洗模块 -- Parser 数据去标签 parser.cc parser.cc 的代码结 ...

  7. 用C++来设计开发的基于boost文档的站内搜索引擎项目,点赞收藏起来!

    So Easy搜索引擎 项目描述 主要技术 项目特点 0. 准备工作 1. 预处理模块 2. 索引模块 3. 搜索模块 4. 服务器模块 项目难点和提升 结束语 项目描述 boost官网虽然提供了在线 ...

  8. C++项目:基于boost在线文档实现的搜索引擎(二)

    C++项目:基于boost在线文档实现的搜索引擎(二) 索引模块 索引模块的描述 正排索引与倒排索引的建立 正排索引 倒排索引 jieba分词,正排查找,倒排查找 jieba分词 索引查找 索引的测试 ...

  9. 【C++项目】boost搜索引擎项目

    文章目录 项目的gitee地址 项目基本演示 讲解思路 一:项目相关背景 二:搜索引擎的相关宏观原理 三:搜索引擎技术栈和项目环境 四:正排索引 vs 倒排索引 - 搜索引擎具体原理 五:编写数据去标 ...

  10. Boost搜索引擎项目

    目录 1.项目相关背景 2.搜索引擎的相关宏观原理 3.搜索引擎技术栈和项目环境 4.正排索引 && 倒排索引--搜索引擎原理 5.编写数据去标签与数据清洗的模块 -- parser. ...

最新文章

  1. xxl-job Vs ElasticJob,谁牛?
  2. python链表的创建_Python——新建链表
  3. 理解和配置Out of memory: Kill process
  4. [C++] 井字棋游戏源码
  5. 微前端在网易七鱼的实践
  6. linux如何用rz上传文件,Linux使用rz命令上传文件
  7. Miner3D 数据分析软件
  8. django 传递中文_如何在Django中建立消息传递状态
  9. airpodspro窃听模式_AirPods Pro实时收听怎么关闭? AirPods Pro实时收听的使用方法
  10. 嘴上说着喜爱Java 9 ,身体却诚实地拥抱了Java 8
  11. Python 手写数字识别实战分享
  12. 典型计算机控制系统硬件组成框图,计算机控制技术重要.docx
  13. knockoutjs介绍
  14. VsCode必备插件
  15. 85 缓存, 验证码 序列化
  16. CRMEB Min电商系统商城源码 v4.3.2
  17. Firemonkey下使用StyleBook的一些经验
  18. 阿里飞猪个性化推荐:召回篇
  19. 建议直接收藏,阿里巴巴开源15个顶级Java项目
  20. 【linux内核分析与应用-陈莉君】时钟中断机制

热门文章

  1. 大师兄科研网_拜托啦,师兄!
  2. linux怎样判断线程是否暂停_怎样寻找合适的创业项目?如何判断一个创业项目是否靠谱?...
  3. ImageJ Nikon_如何用ImageJ进行粒度分析
  4. PS使用:windows解决Adobe Photoshop 2020(PS2020)闪退
  5. CSS:布局——圣杯布局和双飞翼布局
  6. php居中函数,PHP实现的自定义图像居中裁剪函数示例
  7. Spark、Strom、Flink和Beam的技术选型
  8. 如何使用文件的fseek函数对文件指针进行操作
  9. 全局拉普拉斯平滑之(1)Strucutre extraction from texture via relative total variation及稀疏矩阵求解
  10. Ubuntu安装Tensorflow及anaconda环境下使用TensorFlow