项目——boost搜索引擎

news2024/9/22 11:41:33

今天我们来写一个boost搜索引擎!

(后续如果有更新,这个博客也会更新)

gitee连接:boost搜索引擎: boost搜索引擎

首先我们要介绍一下我们这个项目,我们项目的目的是通过我们的搜索引擎能够通过关键字查找到对应的网页,并且可以点击跳转到指定网页,相当于一个搜索框!

首先我们可以去boost官网去下载boost库的网页文件!

然后我们主要需要的是其中的网页文件,所以我们将下载好的压缩包解压以后,将其放在我们的项目文件中!(boost_1_84_0/doc/html

然后我们可以看一下我们的网页文件,会发现里面除了网页的标题,内容,url之外其他的我们并不需要,并且这些东西会干扰对网页内容的提取,所以我们必须要去掉这些无用的标签!

所以我们要编写一个模块,先将这些原始文件处理干净!

于是我们就可以开始写我们的parser模块了!

首先我们看我们的主框架,整个程序的思路是,首先我们要提取出整个文件的内容,然后将所有文件的内容写入一个文件,然后用分隔符进行分割,然后再对文件主要信息进行提取

然后是获取所有合法的html文件的路径

然后就可以开始读取文件内容并且进行解析,主要就是获取每个网页的标题,内容,url

此处的ReadFile是我们封装进util头文件中的函数

然后就是将解析好的内容进行保存!存入一个大的文本之中!

至此parse就基本上完成了!

然后我们就要建立正排索引和倒排索引了。

首先解释一下正排索引和倒排索引是什么意思。

正排索引就比如我们翻书一样,我们先确定翻到那一面,然后翻页到指定页面进行观看。

倒排索引就是我们根据内容反向搜索页数,就像我们字典的目录一样。

然后我们来看具体实现

首先我们要构建每个页面的基本信息结构,一个页面我们关注的主要就是title,content,url。除此之外就不是我们需要关心的信息了。并且数据已经在parser阶段清理,我们现在的任务就是把文档里面的数据读取到我们的数据结构中。

再就是InvertedElem,即一个关键字对应的文章id和权重。

然后我们开始编写创建标签的函数,主要就是创建正排拉链和倒排拉链。

创建正排拉链和倒排拉链的实现如下!

主要就是把保存好的网页数据提取出来,再通过分隔符将数据解析出来,形成一个Doc_Info,然后再保存到我们的正排拉链(其实就是一个vector中)即可,这样下标和id会有一一对应的关系。也方便了我们的倒排索引查到id以后再进行查找!

倒排索引也不复杂,主要就是获取内容(主要工作就是屏蔽大小写和词频统计)

这个地方的词频统计采取非常简单的方法,即标题里面出现权重为10,内容出现权重为1,然后求和即可。(真正的浏览器远远不是如此简单的,不过小项目只需要能展现出排序的原理和功能接可)

然后我们创建每个合法的InvertedElem之后就可以将其放入我们的map(inverted_list)中去了.这样关键字就会和网页信息产生对应效果了。

然后就是为了我们的效率,我们的目录也只需要才去单例模式,也即目录只用创建一次即可,避免重复创建!(注意多线程的问题,要加锁)

然后留出我们的正排索引和倒排索引的调用接口即可,实现如下。

至此,我们的创建索引的工作也基本完成,接下来就实现我们的查找模块!

首先就是初始化搜索也即建立索引即可。

然后我们的网页中一般形成的都是摘要,而非直接展现内容,所以我们还要实现一个获取摘要的函数。

主要就是呈现出关键字附近的文字即可!

最后我们就要实现最为关键的功能,也即搜索功能。

输入查询,然后我们返回json串(对数据进行序列化)

主要就是先对我们的搜索内容进行分词(调boost库的分词功能,CutString对库进行了封装,写在util.hpp中,我们后面再看)。

然后就是根据分词的内容,进行查找!这个地方我们要注意一个问题,由于分词,所以一个搜索会被分为多个关键字,每个关键字都会查找到一些文章,而这些文章的内容很有可能是重复的,所以我们必须进行去重工作!

实现也不难,我们可以准备一个map然后针对同一个id我们对其权值进行累加,然后就对网页实现了去重的操作!

去重以后再把这些内容放入我们的倒排拉链之中!

然后进行第三步,根据权重进行降序排序,使用sort对权值排序即可,比较简单。

最后我们再调用jsoncpp库,把我们的倒排拉链进行序列化即可进行返回即可!

至此我们的查找功能也基本实现完毕!

最后就是我们的http服务器的搭建。

只要调用cpp-httplib库对报文进行响应即可!具体用法大家可以去查文档!

(注意:一定要先升级g++编译器到高版本再进行编译,否则将会出现问题!)

最后我们再编写前端的网页文件即可(然后把根目录给httplib服务器,会自动进行使用前端文件)

(通常默认的网页都叫index.html)

下面是该文件的实现(由于前端文件不是我写的,这个地方就不过多讲解了,大家看一下就好)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1596785.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

中国工控网zggk.item_get API:电商行业数据获取的革新力量

随着信息技术的快速发展,电商行业已经深入渗透到各个领域,成为推动经济发展的重要力量。在这个过程中,数据获取成为了电商企业不可或缺的一环。中国工控网推出的zggk.item_get API,以其高效、准确的数据获取能力,成为了…

MySQL 快问快答

我写这篇文章的目的只有一个:通过这些问题来帮助我去将我脑子里的MySQL脑图给巩固熟悉,通过回答这些问题,让我对脑子里的MySQL知识有更深的印象,当什么时候我的MySQL脑图不熟的时候,我就可以拿这篇文章来去巩固一下&am…

六、新闻主题分类任务

以一段新闻报道中的文本描述内容为输入,使用模型帮助我们判断它最有可能属于哪一种类型的新闻,这是典型的文本分类问题。我们这里假定每种类型是互斥的,即文本描述有且只有一种类型,例如一篇新闻不能即是娱乐类又是财经类&#xf…

mybatis-puls乐观锁

一,乐观锁&悲观锁 乐观锁: 顾名思义十分乐观,他总是认为不会出现问题,无论干什么都不去上锁!如果出现了问题,再次更新值测试 悲观锁;顾名思义十分悲观,他总是认为出现问题,无论干什么都会上锁!再去操作! 乐观锁实现方式: 取出记录时,获取当前version更新时,带上…

线程通信-java

线程通信 当多个线程操作共享多资源时,线程间通过某种方式相互告知自己的状态,以相互协调, 并避免无效的资源争夺。 线程通信的常见模型(生产者与消费者模型) 生产者线程负责生产数据 消费者线程负责消费生产者生…

Redis部署之主从

使用两台云服务器,在 Docker 下部署。 Redis版本为:7.2.4 下载并配置redis 配置文件 下载 wget -c http://download.redis.io/redis-stable/redis.conf配置 master节点配置 bind 0.0.0.0 # 使得Redis服务器可以跨网络访问,生产环境请考虑…

C语言 03 VSCode开发

安装好 C 语言的开发环境后,就需要创建项目进行开发了。 使用 IDE(集成开发环境)进行开发了。 C 语言的开发工具很多,现在主流的有 Clion、Visual Studio、VSCode。 这里以 VSCode 作为演示。 创建项目 安装 VSCode。 推荐直接在…

用c++实现串匹配问题、选择排序

5.2.2 串匹配问题 【问题】 给定两个字符串S和T,在主串S中查找子串T的过程称为串匹配(string matching,也称模式匹配),T称为模式。在文本处理系统、操作系统、编译系统、数据库系统以及 Internet 信息检索系统中,串匹配是使用最频…

MySQL中的存储过程详解(上篇)

使用语言 MySQL 使用工具 Navicat Premium 16 代码能力快速提升小方法,看完代码自己敲一遍,十分有用 拖动表名到查询文件中就可以直接把名字拉进来中括号,就代表可写可不写 目录 1.认识存储过程 1.1 存储过程的作用 1.2 存储过程简介…

OpenHarmony实战开发-图片选择和下载保存案例。

介绍 本示例介绍图片相关场景的使用:包含访问手机相册图片、选择预览图片并显示选择的图片到当前页面,下载并保存网络图片到手机相册或到指定用户目录两个场景。 效果图预览 使用说明 从主页通用场景集里选择图片选择和下载保存进入首页。分两个场景点…

RT-Thread时钟管理

操作系统需要通过时间来规范其任务,主要介绍时钟节拍和基于时钟节拍的定时器。 时钟节拍 任何操作系统都需要提供一个时钟节拍,以供系统处理所有和时间有关的事件,如线程的延时、线程的时间片轮转调度以及定时器超时等。 RT-Thread 中,时钟节拍的长度可以根据 RT_TICK_P…

【Linux】进程的优先级及linux下进程的调度于切换

目录 ​编辑 1.优先级是什么 2.linux中的优先级是怎么实现的 ps -la 命令查看当前用户启动的进程​编辑 linux下调整优先级: ①先top一下 ②点击r ③需要输入进程的pid ④回车 ​编辑 ⑤输入想将优秀级修改的值: linux进程优先级范围为什么必须是【60,9…

音质更细腻,时尚与舒适兼备,唐麦M5耳机体验

在音乐的世界里,一款好的耳机就像是一位懂你的老朋友,它能够准确传达音乐的情感,让你沉浸在每一个音符中。所以无论是在通勤的路上,还是在健身的过程中,一款优质的蓝牙耳机总能为我们带来更加丰富的听觉体验。最近我最…

对中小企业来说,一次的勒索事件有可能造成致命的伤害

勒索攻击越来越频繁 去年的勒索事件数据呈现出显著的增长趋势。具体来说,全球范围内的勒索软件攻击活动愈演愈烈,受害者数量创下历史新高,同比增长了46%。 例如,2023年伊始,英国皇家邮政成为了勒索团伙LockBit的大型…

基于Springboot+Vue+mysql仓库管理系统仓库进销存管理系统

博主介绍: 大家好,本人精通Java、Python、C#、C、C编程语言,同时也熟练掌握微信小程序、Php和Android等技术,能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验,能够为学生提供各类…

Qt-绘制多边形、椭圆、多条直线

1、说明 所有的绘图操作是在绘图事件中进行。mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACEclass MainWindow : public QMainWindow {Q_OBJECTpublic:MainWi…

【debug】复现老版本tensorflow代码,遇到tensorboard的api改变

最近在复现各种代码时候&#xff0c;遇到了版本不匹配问题。每次新建环境太久了&#xff0c;就开始改代码。这里总结一下有哪些点可以改。 从 TensorFlow 1 到 TensorFlow 2 迁移时&#xff0c;TensorBoard 的使用方式也发生了一些变化。这主要是因为 TensorFlow 2 强调更简单…

【Lattice FPGA 开发】Diamond的使用

文章目录 Diamond的使用教程界面器件查看与更改管脚分配RTL分析图查看 第三方工具关联Notepad 问题与解决管脚被分类到unconnected&#xff0c;导致无法分配管脚 Diamond的使用教程 【Lattice FPGA 开发】Diamond的工程建立、文件输入、ip核配置、管脚配置、综合及布线以及下载…

【Booksim】Booksim2.0模拟器集成新拓扑

Incorporating a new topology in Booksim 1. 新拓扑结构2. 需要添加的文件3. 修改步骤 3.1 添加testnet.hpp3.2 添加testnet.cpp3.3 将testnet集成到network.cpp中3.4 创建配置文件testnetconfig3.5 在main.cpp和global.hpp中加入gP_testnet和gA_testnet变量3.6 make进行编译 …