项目——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)

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

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

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

相关文章

【小迪安全2023】第23天:WEB攻防-Python考点CTF与CMS-SSTI模版注入PYC反编译

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收…

【JAVA基础篇教学】第十五篇:Java中Spring详解说明

博主打算从0-1讲解下java基础教学,今天教学第十五篇:Java中Spring详解说明。 Spring 框架是一个广泛应用于 Java 开发的轻量级、全栈式的企业应用开发框架,它提供了众多功能强大的模块,用于简化企业级应用程序的开发。下面详细说…

光纤收发器的注意事项

光纤收发器有各种不同的类别,而实际使用中最受关注的是根据光纤收发器的不同类别:SC连接器光纤收发器和FC/ST连接器光纤收发器。 当使用光纤收发器连接到不同的设备时,必须小心使用不同的端口。 1.光纤收发器与100Base TX设备(交…

第二期书生浦语大模型训练营第三次笔记

RAG RAG是什么? RAG(Retrieval Augmented Generation)技术,通过检索与用户输入相关的信息片段,并结合外部知识库来生成更准确、更丰富的回答。解决 LLMs 在处理知识密集型任务时可能遇到的挑战, 如幻觉、知识过时和缺…

13015.交叉编译移植libz库

文章目录 1 背景2 交叉编译流程2.1 下载源码2.2 编译2.3 测试代码2.4 交叉编译app程序2.5 压缩及效率测试 1 背景 需要再app中使用压缩算法,不能直接移植gzip,gzip交叉编译得到gzip,应该使用libz代码 进行编译生成libz库. 2 交叉编译流程 …

面试手撕合集

82.删除排序链表中的重复元素II 定义单个指针 cur,指向虚拟头节点。如果 cur.next cur.next.next,说明 cur 后面的两个节点重复,例如 节点2 后面存在 2个节点3。我们令 节点2 -> 节点4,实现删除两个节点3的操作。 class Solut…

机器人方向控制中应用的磁阻角度传感芯片

磁阻传感器提供的输出信号几乎不受磁场变动、磁温度系数、磁传感器距离与位置变动影响,可以达到高准确度与高效能,因此相当适合各种要求严格的车用电子与工业控制的应用。所以它远比采用其它传感方法的器件更具有优势。 机器人的应用日渐广泛&#xff0…

Linux Debian安装教程

Debian 是一个免费的开源操作系统,是最古老的 Linux 发行版之一,于 1993 年由 Ian Murdock 创建。它采用了自由软件协议,并且由志愿者社区维护和支持。Debian 的目标是创建一个稳定、安全且易于维护的操作系统,以自由软件为基础&a…

吴恩达机器学习笔记:第 7 周-12支持向量机(Support Vector Machines)12.4-12.6

目录 第 7 周 12、 支持向量机(Support Vector Machines)12.4 核函数 1 第 7 周 12、 支持向量机(Support Vector Machines) 12.4 核函数 1 回顾我们之前讨论过可以使用高级数的多项式模型来解决无法用直线进行分隔的分类 问题: 为了获得上图所示的判定边界&…

电子元器件线上交易商城搭建的价值和必要性-加速度jsudo

随着科技的飞速发展,电子元器件行业正迎来前所未有的变革。为了满足市场对于电子元器件采购的便捷性、高效性和多样性的需求,电子元器件商城的开发显得尤为重要。本文将探讨电子元器件商城开发的重要性、主要功能以及它如何助力行业发展。 电子元器件商城…

【word】文档标题如何自动编号

我在写一个word文档的时候,每一级标题的格式都设置好了,包括字体,大小等等,但是如何自动编号呢? 在写中期报告的时候,我对每一级标题的格式都创建了一个单独的样式,像这样: 对于每一…

Vue3——Tinymce6富文本编辑器的使用方法

TinyMCE 6 是一款功能强大且灵活的富文本编辑器,可以嵌入到 Web 应用程序中。 一、安装 本文的讲解主要以tinymce6 版本为例 官网地址 Migrating from TinyMCE 5 to TinyMCE 6 | TinyMCE Documentation ​ 要将 TinyMCE 添加到项目中,请执行以下操…

Springboot+Vue项目-基于Java+Mysql的网上订餐系统(附源码+LW+演示录像)

大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:Java毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计 &…

Python框架之UnitTest

unittest 是python 的单元测试框架,unittest 单元测试提供了创建测试用例,测试套件以及批量执行的方案, unittest 在安装pyhton 以后就直接自带了,直接import unittest 就可以使用,测试人员用UnitTest来做自动化测试&a…

【CSS】盒子居中

目录 效果图 代码及其解释 补充解释 效果图 同时实现盒子与文字的居中 代码及其解释 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style type"text/css">#box1{width: 500px;height:…

阿斯达年代记三强争霸开服时间+官网地址+预约下载安装教程分享

阿斯达年代记国际服&#xff0c;游戏分为三个势力&#xff0c;分别是阿斯达、亚高和不罚者&#xff0c;每个玩家都必须选择一个势力&#xff0c;而每个势力每周将会诞生一名势力族长&#xff0c;将会从五名候选人中投票产生&#xff0c;想要进入候选人名单&#xff0c;必须每天…

Netty学习——实战篇2 NIO 群聊系统(简单版) 备份

需求&#xff1a; 1、编写一个NIO群聊系统&#xff0c;实现服务端和客户端之间数据简单通讯(非阻塞) 2、实现多人群聊 3、服务端&#xff1a;可以监测用户上线、离线、并实现消息转发功能。 4、客户端&#xff1a;通过channel可以无阻塞发送消息给其他所有用户&#xff0c;同时…

分类算法(数据挖掘)

目录 1. 逻辑回归&#xff08;Logistic Regression&#xff09; 2. 支持向量机&#xff08;Support Vector Machine, SVM&#xff09; 3. 决策树&#xff08;Decision Tree&#xff09; 4. 随机森林&#xff08;Random Forest&#xff09; 5. K近邻&#xff08;K-Nearest …

Vue3(三):生命周期、路由、自定义hooks

这里终于明白了为什么一直有这个语法报错&#xff0c;就是在提示你哪里错的地方上方注释一行/*eslint-disable*/&#xff0c;之前一直警告这个错误感谢老师&#xff01; 一、vue2和vue3生命周期 还有一个问题就是父组件和子组件哪个先挂载完毕呢&#xff1f;答案是子组件先挂…