项目——boost搜索引擎

今天我们来写一个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)

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Open3D (C++) 点云投影至主成分空间

目录 一、算法原理二、代码实现三、结果展示四、相关连接Open3D (C++) 点云投影至主成分空间由CSDN点云侠原创,爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 p r o j

【数据结构】树与二叉树、树与森林部分习题与算法设计例题

目录 【数据结构】树与二叉树部分习题与算法设计例题一、单选题二、算法设计题判断二叉树是否为完全二叉树求二叉树的最小深度 以及 二叉树树高 树与二叉树知识点文章: 【数据结构】树与二叉树(递归法先序、中序、后序、层次遍历二叉树、二叉树的建立以及求树高的方…

【MySQL数据库 | 第二十四篇】Limit语句的性能问题和调优策略

前言: MySQL作为最流行的关系型数据库管理系统之一,被广泛应用于各种规模和类型的应用程序中。其强大的功能和灵活的查询语言使得开发人员能够高效地执行各种数据操作和分析。 然而,在处理大量数据或复杂查询时,一些开发人员可能…

研究生,该学单片机还是plc。?

PLC门槛相对较低,但是在深入学习和应用时,仍然有很高的技术要求。我这里有一套单片机入门教程,不仅包含了详细的视频 讲解,项目实战。如果你渴望学习单片机,不妨点个关注,给个评论222,私信22&am…

仿真服务器介绍及应用

仿真服务器是一种高性能的计算设备,专门用于运行复杂的仿真软件和处理大量的计算任务。 仿真服务器通常具备以下特点: 1. 高性能硬件配置:为了满足仿真软件对计算能力的要求,仿真服务器通常配备高性能的CPU、大量的内存以及高速的…

Zookeeper与Kafka消息队列

目录 一、Zookeeper 1、zookeeper简介 2、zookeeper的特点 3、zookeeper的工作模式跟工作机制 3.1 工作模式: 3.2工作机制:​编辑 4、zookeeper应用场景及选举机制 4.1 应用场景: 4.2 选举机制: 4.2.1第一次启动选举机制…

[阅读笔记1][GPT-3]Language Models are Few-Shot Learners

首先讲一下GPT3这篇论文,文章标题是语言模型是小样本学习者,openai于2020年发表的。 这篇是在GPT2的基础上写的,由于GPT2还存在一些局限,这篇对之前的GPT2进行了一些完善。GPT2提出了多任务学习,也就是可以零样本地用在…

ABAP MESSAGE 常用的类型

类型文本描述A终止处理终止,用户必须重启事务X退出与消息类型A 类似,但带有程序崩溃 MESSAGE_TYPE_XE错误处理受到干扰,用户必须修正输入条目,左下角提示!W警告处理受到干扰,用户可以修正输入条目,左下角提示!I信息处理受到干扰&a…

数字的字面表示:正负数、进位制、数学浮点数与科学计数法

示例&#xff1a; /*** brief how about plain-number? show you here.* author wenxuanpei* email 15873152445163.com(query for any question here)*/ #define _CRT_SECURE_NO_WARNINGS//support c-library in Microsoft-Visual-Studio #include <stdio.h>static…

【代码随想录】【动态规划】day43:● 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零

最后一块石头的重量 与分割等和子集类似 思路&#xff1a;尽量分割成两个sum值相近的数组1和2&#xff0c;求其中一个数组为sum(stone)//2时的一种情况 dp[j]:容量&#xff08;这里说容量更形象&#xff0c;其实就是重量&#xff09;为j的背包&#xff0c;最多可以背最大重量…

DFS专题:力扣岛屿问题(持续更新)

DFS专题&#xff1a;力扣岛屿问题 一、岛屿数量 题目链接: 200.岛屿数量 题目描述 代码思路 使用for对每一个网格点进行判断&#xff0c;如果遇到未搜索过的’1’&#xff0c;则使岛屿数加一&#xff0c;并利用dfs将与其相连的‘1’都进行标记&#xff0c;确保每次搜索到1都…

51单片机-LED模块

文章目录 1.点亮一个LED灯2.LED闪烁3.LED流水灯 1.点亮一个LED灯 #include <REGX52.H> void main() {P20xFE; //1111 1110while(1){} }2.LED闪烁 增加延时&#xff0c;控制LED的亮灭间隙 延时函数的添加依靠STC-ISP软件的延时函数功能代码自动生成&#xff0c;如图 #i…

数据库查询:查询入参类型和数据库字段类型不匹配导致的问题

问题&#xff1a;假设我们现在有这样的一张表 CREATE TABLE test_person (id int(20) NOT NULL COMMENT 主键,name varchar(20) DEFAULT NULL COMMENT 姓名,gender char(2) DEFAULT NULL COMMENT 性别,birthday date DEFAULT NULL COMMENT 生日,created_time timestamp NULL D…

【电控笔记8】前馈技术

2.4前馈 前馈可以减轻控制器的负担

安宝特方案 | AR工业解决方案系列-工厂督查

在工业4.0时代&#xff0c;增强现实&#xff08;AR&#xff09;技术正全面重塑传统工业生产&#xff0c;在工厂监督领域&#xff0c;其应用不仅大幅提升了生产效率、监测准确性和规范执行程度&#xff0c;而且为整体生产力带来了质的飞跃。 01 传统挑战与痛点 在制造业生产流程…

【前端面试3+1】17 伪类和伪元素的区别、CSS权重、图片显示优化、【二叉树最大深度】

一、伪类和伪元素的区别 1、伪类&#xff1a; 伪类是用来描述元素的特定状态的选择器&#xff0c;比如:hover、:active、:first-child等。伪类在选择器中以冒号&#xff08;:&#xff09;开头&#xff0c;用于匹配处于特定状态的元素。伪类可以用于选择DOM元素的特定状态&#…

ARM看门狗定时器

作用 在S3C2440A中&#xff0c;看门狗定时器的作用是当由于噪声和系统错误引起的故障干扰时恢复控制器的工作。 也就是说&#xff0c;系统内部的看门狗定时器需要在指定时间内向一个特殊的寄存器内写入一个数值&#xff0c;俗称喂狗。 如果喂狗的时间过了&#xff0c;那么看门…

基于springboot+vue实现的疫情防控物资调配与管理系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…

探索顶级短视频素材库:多样化选择助力创作

在数字创作的浪潮中&#xff0c;寻找优质的短视频素材库是每位视频制作者的必经之路。多种短视频素材库有哪些&#xff1f;这里为您介绍一系列精选的素材库&#xff0c;它们不仅丰富多样&#xff0c;而且高质量&#xff0c;能极大地提升您的视频创作效率和质量。 1.蛙学网 蛙学…

git操作基本命令

Git命令操作&#xff1a; 1、服务器上面有新的修改&#xff0c;pull出现错误操作如下 git stash git pull origin master git stash pop 2、删除本地一个文件test.py,想重新download远程服务器最新的文件 #git checkout test.py 3、查看当前处于哪一个分支 #git …