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.rhkb.cn/news/297791.html

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

相关文章

如何保证Redis的缓存和数据库中的数据的一致性?

Redis的缓存如何和数据库中的数据保持一致性? 我们都知道,Redis是一个基于内存的键值存储系统,数据完全存放在内存中,这使得它的读写速度远超传统的硬盘存储数据库。对于高访问频率、低修改率的数据,通过将它们缓存在…

第23章-OSPF基础

1. RIP协议的问题 2. OSPF概述 3. OSPF初始化流程 4. OSPF报文类型 5. OSPF分区域管理 1. RIP协议的问题 1)问题1 设计粗糙 2)问题2 环路问题:会产生环路 跳数限制:最大跳数受限,无法大规模组网 广播方式:广…

设计模式总结-抽象工厂模式

抽象工厂模式 模式动机模式定义模式结构模式分析模式实例与解析实例一:电器工厂 模式动机 在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工…

微信小程序怎么制作?制作一个微信小程序需要多少钱?

随着移动互联网的快速发展,微信小程序已成为连接用户与服务的重要桥梁。它以其便捷性和易用性,为各类企业和个人提供了一个全新的展示和交易平台。那么,如何制作一个微信小程序?又需要投入多少资金呢?本文将为您提供全…

H5面临的网络安全威胁和防范措施

H5,是基于HTML5技术的网页文件。HTML,全称Hyper Text Markup Language,即超文本标记语言,由Web的发明者Tim Berners-Lee与同事Daniel W. Connolly共同创立。作为SGML的一种应用,HTML编写的超文本文档能够独立于各种操作…

java自动化-03-04java基础之数据类型举例

1、需要特殊注意的数据类型举例 1)定义float类型,赋值时需要再小数后面带f float num11.2f; System.out.println(num1);2)定义double类型,赋值时直接输入小数就可以 3)另外需要注意,float类型的精度问题…

Swing中的FlowLayout/WrapLayout在打横排列时候如何做到置顶对齐

前言 最近在开发swing客户端时候碰到一个棘手的问题: Swing中的FlowLayout/WrapLayout在打横排列时候如何做到置顶对齐如果是vue或者react,一搜百度什么都出来了,swing的话,嗯。。。资料有点少而且大部分是stack overflow上面的…

CEF的了解

(14 封私信 / 80 条消息) CEF和Electron的区别是什么? - 知乎 (zhihu.com) Electron面向的开发者:会用JavaScript,HTML,CSS,不会C CEF面向的开发者:会用JavaScript,HTML,CSS,会C (14 封私信 / 80 条消息) liulun - …

UI自动化测试重点思考(上)--元素定位/验证码/测试框架

UI自动化测试重点思考--元素定位 Selenium定位元素selenium中如何判断元素是否存在?定位页面元素webdriver打开页面id定位name定位class_name定位tag_name 定位xpath定位css_selector定位link_text 定位partial_link 定位总结 selenium中元素定位的难点?…

典型病例(第二期):血糖18.3,小便多且泡沫难消,滋阴补肾效果显著

案例分享: 患者廖先生,男,43岁 主诉:身体明显特别消瘦,血糖检测达到18.3,患者口干口渴,小便频繁,且带有很难消散的泡沫,疲倦乏力,多食易饥,每天…

MySQL 主从复制架构搭建及其原理

前言 系统的性能瓶颈一般出现在数据库上,以 mysql 为例,如果存在高并发的写请求,势必会有锁表,锁数据行的情况发生,这时候如果有读请求刚好访问到被锁的数据,那么读请求会阻塞,直到写请求处理完…

前端三剑客 —— CSS (第六节)

目录 内容回顾: 弹性布局属性介绍 案例演示 商品案例 布局分析 登录案例 网格布局 内容回顾: 变量:定义变量使用 --名称:值; 使用变量: 属性名:var(--名称)&a…

爬虫实战三、PyCharm搭建Scrapy开发调试环境

#一、环境准备 Python开发环境以及Scrapy框架安装,参考:爬虫实战一、Scrapy开发环境(Win10Anaconda)搭建 PyCharm安装和破解,参考:爬虫实战二、2019年PyCharm安装(激活到2100年) …

基于ArgoCD和Testkube打造GitOps驱动的Kubernetes测试环境

本文介绍了一项新工具,可以基于Gitops手动或者自动实现Kubernetes集群应用测试,确保集群的健康状态与Git仓库定义的一致。原文: GitOps-Powered Kubernetes Testing Machine: ArgoCD Testkube 简介:GitOps 云原生测试面临的挑战 现代云原生应…

SQLite的架构(十一)

返回:SQLite—系列文章目录 上一篇:SQLite下一代查询规划器(十) 下一篇:SQLite—系列文章目录 介绍 本文档介绍SQLite库的架构。 这里的信息对那些想要了解或 修改SQLite的内部工作原理。 接口SQL 命令处理器虚拟机B-树…

PHP 插值搜索(Interpolation Search)

给定一个由 n 个均匀分布值 arr[] 组成的排序数组,编写一个函数来搜索数组中的特定元素 x。 线性搜索需要 O(n) 时间找到元素,跳转搜索需要 O(? n) 时间,二分搜索需要 O(log n) 时间。 插值搜索是对实例二分搜索的改进,…

Api网关-使用Grafana可视化Apisix指标

文章目录 前言一、Apisix部署二、安装配置Grafana1. 安装Grafana2. 设置中文3. 启动4. 登录5. 启停命令5.1 启动和停止5.2 启禁用开机自启动5.3 查看状态 三、安装配置prometheus1. 安装2. 配置服务3. 启动4. 登录5. prometheus启停命令5.1 启动和停止5.2 启禁用开机自启动5.3 …

element-ui breadcrumb 组件源码分享

今日简单分享 breadcrumb 组件的源码实现,主要从以下三个方面: 1、breadcrumb 组件页面结构 2、breadcrumb 组件属性 3、breadcrumb 组件 slot 一、breadcrumb 组件页面结构 二、breadcrumb 组件属性 2.1 separator 属性,分隔符&#xff…

钉钉事件订阅前缀树算法gin框架解析

当钉钉监测到发生一些事件,如下图 此处举例三个事件user_add_org、user_change_org、user_leave_org,传统的做法是,我们写三个if条件,类似下图 这样字符串匹配效率比较低,于是联想到gin框架中的路由匹配算法&#xff0…

【大数据存储】实验4 NoSQL数据库

实验4 NoSQL数据库 NoSQL数据库的安装和使用实验环境: Ubuntu 22.04.3 Jdk 1.8.0_341 Hadoop 3.2.3 Hbase 2.4.17 Redis 6.0.6 mongdb 6.0.12 mogosh 2.1.0 Redis 安装redis完成 新建终端启动redisredis-server新建一个终端redis-cli 建表操作 尝…