BoostCompass —— 搜索引擎

在这里插入图片描述

文章目录

  • 一、项目简介
  • 二、Boost库简介
    • 1. 简介
    • 2. Boost 库的特点
  • 三、项目主要模块
    • 1. 网页内容获取,数据预处理模块
    • 2. 建立正排索引和倒排索引,项目核心模块
    • 3. 编写 http_server 模块,进行网络开放
  • 四、项目功能预览
    • 1. 项目文件预览
    • 2. 项目执行步骤
  • 五、总结

一、项目简介

BoostCompass 是一款基于 Boost 文档的站内搜索引擎。用户只需输入查询关键词,即可快速检索到相关的 Boost 在线文档,并提供相关网页链接,为用户提供了便捷的检索服务。

首先,我们对离线版本的 HTML 文档进行解析,并将解析结果整理为一个行文本文件。然后,读取并处理好的文本文件,进行分词、权重计算等操作,同时在内存中构建正排索引和倒排索引。接下来,对用户查询词进行分词和触发,根据相关度对结果进行排序。最后,将结果以 JSON 格式进行包装,并序列化为字符串返回。所有这些功能通过 HTTP 服务器搭载搜索页面,为外部用户提供服务。

二、Boost库简介

🔴 Boost官网链接
在这里插入图片描述

1. 简介

Boost 是一个由C++社区开发和维护的开源库集合,它提供了许多功能强大且高质量的 C++ 库,可以扩展 C++ 标准库的功能。Boost 库包含了许多与 C++ 标准库相似的组件,同时还提供了一些独特的功能和工具,比如 Boost.Asio 用于网络编程、Boost.Thread 用于线程操作、Boost.Filesystem 用于文件系统操作等等。

Boost 库的目标是通过提供高质量、可移植、且兼容标准的 C++ 库来增强 C++ 的功能和性能。它的发展历史可以追溯到 1998 年,是一个长期积累和发展的项目。由于 Boost 的质量和广泛使用,很多 Boost 库最终被纳入了 C++ 标准库,比如智能指针、函数对象、元编程库等。

2. Boost 库的特点

  1. 高质量:Boost 库经过严格的测试和审核,确保了高质量的代码和可靠的功能。

  2. 可移植性:Boost 库可以在各种平台上使用,包括 Windows、Linux、Mac 等,为 C++ 程序的跨平台开发提供了便利。

  3. 兼容性:Boost 库与 C++ 标准库兼容,并且遵循 C++ 的最佳实践,可以与现有的 C++ 代码很好地集成和使用。

  4. 功能丰富:Boost 库涵盖了很多领域,包括但不限于网络编程、多线程、文件系统、智能指针、正则表达式、容器和算法等,为 C++ 开发者提供了丰富的工具和组件。

总的来说,Boost 库是 C++ 社区中非常重要的一个开源项目,为 C++ 程序员提供了丰富的工具和功能,有助于提高代码的质量、可移植性和性能。

三、项目主要模块

1. 网页内容获取,数据预处理模块

这个模块代码的主要思路是从指定目录中枚举所有HTML文件,解析出每个文件的标题、内容和URL,并将这些信息以特定的格式保存到一个文本文件中。我们首先使用boost::filesystem库递归遍历目录,收集所有HTML文件的路径,然后逐个读取文件内容,通过自定义的解析函数提取所需信息。解析出的文档数据随后被写入到一个输出文件中,使用特定分隔符来区分不同文档的记录。我们在执行过程中进行了详尽的错误检查和处理,确保了其健壮性。

2. 建立正排索引和倒排索引,项目核心模块

这个模块我们定义了一个名为Index的C++类,用于构建和维护一个文档索引系统。该系统采用单例模式确保只有一个索引实例,并使用正排索引和倒排索引来快速检索文档。正排索引存储了文档的基本信息,如标题、内容和URL,而倒排索引则根据关键词将文档分组。类中提供了构建索引、获取文档信息和获取倒排列表的方法。构建索引的过程涉及读取处理过的数据文件,解析文档数据,并根据文档内容构建索引。此外,我们还实现了简单的进度显示功能。整个索引系统的构建旨在提高文档检索的效率和准确性。

3. 编写 http_server 模块,进行网络开放

这个模块是一个基于C++的简单搜索引擎服务程序,我们整合了HTTP服务器和搜索功能。我们首先初始化一个搜索器对象,使用预先处理好的文档数据(来自第一个模块)来建立索引。然后,我们设置了一个HTTP服务器,并为服务器定义了一个GET请求的处理函数,该函数响应客户端对"/s"路径的访问。

当客户端发送包含搜索关键字的请求时,服务器会验证请求中是否包含关键字参数。如果没有关键字,服务器会返回错误信息。如果有关键字,服务器将调用搜索器的搜索方法,传入关键字,并获取搜索结果,这些结果被封装为JSON字符串返回给客户端。

服务器在启动时会记录一条日志信息,指示服务器已成功启动,并开始监听所有IP地址的8081端口上的请求。

四、项目功能预览

1. 项目文件预览

在这里插入图片描述
上面的图片包含了最后所用到的文件,这些文件包含了最后所使用的文档和资源,想要具体了解的可以点击后面的传送门:🔴 项目代码URL传送

2. 项目执行步骤

  1. 在控制台输入make命令,会生成三个可执行文件parserdebughttp_server如下图所示
    在这里插入图片描述
  2. 运行parser文件,在控制台输入./parser命令
  3. 运行http_server文件,在控制台输入./http_server命令,效果如下图所示
    在这里插入图片描述

⭕执行时间大概六分钟左右进度会到达100%

在这里插入图片描述

  1. 打开任意浏览器, 在网址搜索栏搜索URL:[主机IP]:8081 如下图所示
    在这里插入图片描述

  2. 在搜索框里面搜索Boost库内的关键词,如下图我们搜索Boost organization得到的结果
    在这里插入图片描述

五、总结

目前我们仅进行了基础的介绍,涵盖了一些基本的使用方法。接下来,我将逐步更新更详细的内容,包括代码解释和更深入的功能介绍。敬请期待!

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

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

相关文章

java自动化测试学习-03-06java基础之运算符

运算符 算术运算符 运算符含义举例加法,运算符两侧的值相加ab等于10-减法,运算符左侧减右侧的值a-b等于6*乘法,运算符左侧的值乘以右侧的值a*b等于16/除法,运算符左侧的值除以右侧的值a/b等于4%取余,运算符左侧的值除…

开启短剧盈利新模式:短剧CPS分销系统开发助力创作者与分销商共赢

在数字内容蓬勃发展的今天,短剧以其独特的魅力迅速占领了市场的一席之地。短剧以其紧凑的剧情、精彩的演绎,吸引了大量用户的关注和喜爱。然而,如何在短剧市场中实现商业价值的最大化,一直是业内关注的焦点。为此,我们…

个人品牌打造IP孵化运营培训教程架构课件

【资料持续更新,以防走丢】 个人品牌打造IP孵化运营培训教程架构课件 部分资料预览 资料部分是网络整理,仅供学习参考。 个人品牌运营合集 (完整资料包含以下内容)目录 详细的个人IP运营方案: 1. 确定个人定位和…

【Linux】进程控制之进程程序替换

目录 前言 替换的原理 替换函数 记忆技巧 函数使用 execl execlp execv execvp execle execvpe 调用其它语言的程序 模拟实现一个shell 前言 关于本文可以先去看看上一篇【Linux】进程控制详解-CSDN博客可以更好的理解这里的内容 学完本篇文章,你就…

浅聊什么是Redis?

需求:MySQL面临大量的查询,即读写操作,因此类比CPU,给数据加缓存,Redis诞生。应用程序从MySQL查询的数据,在Redis设置缓存(记录在内存中,无需IO操作),后再需要…

【吊打面试官系列】Redis篇 - 使用过 Redis 分布式锁么,它是什么回事?

大家好,我是锋哥。今天分享关于 【使用过 Redis 分布式锁么,它是什么回事?】面试题,希望对大家有帮助; 使用过 Redis 分布式锁么,它是什么回事? 先拿 setnx 来争抢锁,抢到之后&#…

2.Swift基础控件:图标文字按钮

Swift图标标题按钮 一、自定义IconTitleButton类 import Foundation/* 枚举 设置 图片的位置 */ enum ButtonImagePosition : Int {case imageTop 0case imageLeftcase imageBottomcase imageRight } extension UIButton {/**type :image 的位置Space &#xff1…

leetcode代码记录(买卖股票的最佳时机

目录 1. 题目:2. 我的代码:小结: 1. 题目: 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股…

蓝桥-时间显示

目录 题目链接 代码 题目链接 1.时间显示 - 蓝桥云课 (lanqiao.cn) 代码 #include <bits/stdc.h> using namespace std;int main() {long long x;cin>>x;int h,m,s;x x / 1000 % (3600*24); // 毫秒化秒&#xff0c;并且保留最后一天的时间h x / 3600; //求得…

第四百四十三回

文章目录 1. 概念介绍2. 思路与方法2.1 整体思路2.2 使用方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"自定义Action菜单"相关的内容&#xff0c;本章回中将介绍如何获取屏幕相关参数.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在本…

Qtxlsx第三方库的安装和使用

本文仅作为一个记录&#xff0c;安装QtXlsx方便操作excel&#xff0c;主要参考了这篇博文&#xff1a;https://blog.csdn.net/u014779536/article/details/111769792 1&#xff0c;下载安装Perl脚本Strawberry Perl for Windows&#xff0c;默认安装strawberry-perl-5.30.0.1-…

程序·人生

诡异之极 2024.03.12 清新环境&#xff08;股票代码002573&#xff09;委托卖出 20000股&#xff0c;委托价4.58&#xff0c;当日最高价4.57 2024.03.11 清新环境&#xff08;股票代码002573&#xff09;委托卖出 20000股&#xff0c;委托价4.55&#xff0c;当日最高价4.54 …

汉明码检错与纠错的结论(hamming code)

假如一组二进制数据为101&#xff0c;另外一组为111&#xff0c;那么显然把第一组的第二位数据0改成1就可以变成第二组数据111&#xff0c;所以两组数据的汉明距离就为1 简单点说&#xff0c;汉明距离就是一组二进制数据变成另一组数据所需的步骤数&#xff08;它表示两个相同长…

策略模式图

策略模式 小小的图解 主要的三个角色 Strategy—抽象策略角色ConcreateStrategy—具体策略角色Context—上下文角色 封装了对具体策略的调用可以使用set的依赖注入也可以使用构造方法 核心是上下文角色 只要调用上下文角色就行&#xff0c;实现解耦 策略 工厂 将上下文角…

深入理解MP4视频文件裁剪原理[下下]

深入理解MP4视频文件裁剪原理[上] 深入理解MP4视频文件裁剪原理[中] 深入理解MP4视频文件裁剪原理[下] 深入理解MP4视频文件裁剪原理[下下] 3.22 stco box* stco box记录了每个chunk在MP4文件中的偏移量。如下图24: 图24 这里的offset指的是chunk的起始位置相对于整个MP4文…

Pytoch安装记录

使用pycharm 1、CUDA的安装 官网&#xff1a;CUDA Toolkit Archive | NVIDIA Developer 选择对应的版本 选择对应的版本进行下载&#xff1a; 有3个多G cuda的安装需要注意&#xff0c;如果没有安装vs&#xff0c;则需要选择自定义安装&#xff0c;在自定义的安装中取消 安…

【系统架构师】-系统可靠性分析与设计

1、可靠性与可用性区别 1、系统可靠性&#xff1a;系统在规定时间内及规定的环境下&#xff0c;完成规定功能的能力&#xff0c;即系统无故障运行的概率 2、系统可用性&#xff1a;在某个给定时间点上系统能够按照需求执行的概率。 可靠性分为软件、硬件可靠性 2、可靠性指标…

观察者模式 C++

&#x1f442; Honey Honey - 孙燕姿 - 单曲 - 网易云音乐 目录 &#x1f33c;前言 &#x1f33c;描述 &#x1f382;问题 &#x1f4aa;解决方案 &#x1f232;现实场景 代码 场景1 -- 报纸发行 场景 解释 代码 场景2 -- 气象资料发布 场景3 -- 过红绿灯 &#x…

视频分块上传Vue3+SpringBoot3+Minio

文章目录 一、简化演示分块上传、合并分块断点续传秒传 二、更详细的逻辑和细节问题可能存在的隐患 三、代码示例前端代码后端代码 一、简化演示 分块上传、合并分块 前端将完整的视频文件分割成多份文件块&#xff0c;依次上传到后端&#xff0c;后端将其保存到文件系统。前…

C++读取.bin二进制文件

C读取.bin二进制文件 在C中&#xff0c;可以使用文件输入/输出流来进行二进制文件的读写操作&#xff0c;方便数据的保存和读写。 //C读取bin二进制文件 int read_bin() {std::ifstream file("data_100.bin", std::ios::in | std::ios::binary);if (file) {// 按照…