[C++项目] Boost文档 站内搜索引擎(1): 项目背景介绍、相关技术栈、相关概念介绍...

|cover


项目背景

Boost库是C++中一个非常重要的开源库. 它实现了许多C++标准库中没有涉及的特性和功能, 一度成为了C++标准库的拓展库. C++新标准的内容, 很大一部分脱胎于Boost库中.

Boost库的高质量代码 以及 提供了更多实用方便的C++组件, 使得Boost库在C++开发中会被高频使用

为方便开发者学习使用, Boost库官网(boost.org)也提供了不同版本库组件的相关介绍文档, 但是Boost库的官网在相当长一段时间都是没有站内搜索的. 应该是近两个月左右才 实现了站内搜索 的功能:

但是, Boost库官网实现的站内搜索是全局的搜索, 很多时候大部分开发者只需要查看某个组件的文档用以学习.

此时 使用Boost官方提供的站内搜索也是很不方便的, 而且也不支持选择版本来获取相关文档:

所以就有了本项目的出现, Boost库指定版本提供文档的站内搜索

搜索引擎相关宏观原理

我们每个人一定都使用过搜索引擎, 一般人常用的一定有: Bing、百度、Google…

使用搜索引擎搜索一定的内容, 出现的页面一般是这样的:

其中最主要的部分是这样的:

搜索引擎通常会将搜索到的内容, 以: 网页的标题(title)网页的简单摘要(Content)即将跳转到的网页的网址(url) 为一个单元的形式展现出来. 并且, 包含的搜索的 关键字会被高亮显示

其他搜索引擎也是大同小异:

那么, 搜索引擎是如何做这整个过程的呢?


首先要明白, 输入关键字 点击搜索的这个行为, 其实是在创建并向服务器发送http/https请求的行为.

在客户端输入关键词, 点击搜索. 创建请求, 携带关键词向服务器发送请求.

服务器接收到请求之后, 根据关键词 在服务器检索索引 获取所有相关的html的内容, 然后 将获取到的多个网页内容(title、content、url), 拼接构建成一个新的网页 响应回客户端.

整个过程中最重要的过程在于: 检索索引

关于索引, 实际是一个帮助快速查找数据的数据结构. 根据关键词 检索索引, 就是在数据结构中查找关键词相关的数据.

索引, 是在 搜索引擎服务启动之前 服务器提前建立好的. 搜索引擎服务启动之后, 可以直接通过索引来检索数据.

搜索引擎索引的建立步骤一般是这样的:

  1. 爬虫程序爬取网络上的内容, 获取网页等数据
  2. 对爬取的内容进行解析、去标签, 提取文本、链接、媒体内容等信息
  3. 对提取的文本进行分词、处理, 得到词条
  4. 根据词条生成索引, 包括正排索引、倒排索引等

建立好索引之后, 搜索引擎服务就可以根据关键词 检索索引 获取相关数据.

这一整个流程, 即为 搜索引擎的相关宏观原理

大致的流程 以及 宏观原理图, 可以根据这一张图来理解

服务端需要做的第一个工作是爬取网页.

但是本项目中不需要, 因为是站内文档搜索, 官方提供的也有Boost库的相关源码文件, 其中就包括了Boost库的文档html文件.

Boost库源码下载

https://boostorg.jfrog.io/artifactory/main/release/

这是Boost库的源码发布页. 我们可以直接找到指定版本获取下载链接, 将文件下载到服务器中:

wget https://boostorg.jfrog.io/artifactory/main/release/1.82.0/source/boost_1_82_0.tar.gz

获取到源码压缩文件之后, 执行tar -zxvf boost_1_82_0.tar.gz解压

然后就获取了Boost库源码:

其中, 所有的文档html文件都在 doc//html/目录下:

|inline

统计了一下, 此目录下(包括子目录) 一共有8563html文件, 这些都是Boost库提供的文档

Boost库站内文档搜索 所需技术栈 以及 项目环境

技术栈:

  1. 后端: C/C++ C++11 STL Boost库 Jsoncpp cppjieba cpp-httplib
  2. 前端: html css js jQuery Ajax

项目环境:

  1. Centos 7云服务器 neovim gcc(g++) makefile

清理 分词 和 索引

实现一个搜索引擎, 最重要的地方在于 建立索引

建立索引, 就是建立 文档与关键词之间的的映射

清理文档文件

所以在建立索引之前, 要 先清理文档中对搜索无用的无效数据. 在html文件中, 无效数据就是html的各种标签:

<!-- 各种成对的标签 -->
<html></html>
<head></head>
<body></body>
<div></div>
<!-- 各种单独的标签 -->
<link>
<meta>
<img>

标签中, <>之间的内容都是对搜索来说无效的内容. 而对于成对的标签来说 ><之间的内容则是有效的内容.

简单点来说, 标签内部的数据 是对搜索无效的数据, 标签外的数据是对搜索有效的数据.

简单的举例子:

<div><p class="copyright">Copyright © 2005, 2006 Eric Niebler</p></div>
<div class="toc">
<p><b>Table of Contents</b></p>

其中有效的数据是: Copyright © 2005, 2006 Eric NieblerTable of Contents

其他的都属于标签内的数据, 都是对搜索无效的, 因为浏览器不会将标签内的数据值渲染出来, 那是一些属性.

分词

清理完文档中对搜索无用的无效数据之后, 就可以对文档的内容 进行分词.

分词, 就是将一句话中可用作关键字的词语分割开, 比如:

  1. 博主买了一些小米和南瓜

    分词就可能会分为: 博主 一些 小米 南瓜 小米和南瓜

  2. 博主做了小米南瓜粥吗

    分词就可能会分为: 博主 小米 南瓜 南瓜粥 小米南瓜粥

将可用作关键词的词汇组合或分开并汇总, 停止词不考虑, 就是分词.

停止词, 就是搜索中没有明显作用的词: 了 的 吗 呢 a the ...

索引

每个文件都有文件名 也就是文件ID, 文件内容包含了关键词. 将文件名和关键词之间建立映射关系, 就是建立索引.

以下以两个文件为例

  1. 文件1: 博主买了一些小米和南瓜

  2. 文件2: 博主做了小米南瓜粥吗

正排索引

正排索引, 是 从文件ID找到文件关键词:

文件ID内容关键词
文件1博主 一些 小米 南瓜 小米和南瓜
文件2博主 小米 南瓜 南瓜粥 小米南瓜粥

可以看作, 文件ID是Key 用于查找, 内容关键词是Value 是被找到的内容. 建立正排索引可以不对文件内容做分词

此项目中, 建立正派索引时不对文件内容做分词处理

倒排索引

与正排索引相反.

倒排索引, 是 从文件关键词找到文件ID. 并且, 会将所有文档中的关键词进行汇总去重:

关键词(唯一)涉及的文件ID(文件权重)
博主文件1、文件2
文件1
一些文件1
小米文件1、文件2
南瓜文件1、文件2
小米和南瓜文件1
文件2
南瓜粥文件2
小米南瓜粥文件2

可以看作, 关键词是Key 用于查找, 文件ID是Value 是被找到的内容.


项目中, 正排索引和倒排索引都需要建立并使用.

模拟整个查找到检索索引再到响应的流程:

输入关键词 --> “博主” --> 先在倒排索引检索 --> 获取"文件1""文件2"文件ID --> 再根据获取的文件ID在正排索引中检索 --> 检索到相关文件的文件内容(title、content、url) --> 根据内容构建新网页 --> 响应新网页


本片文章介绍了项目背景, 从下一篇文章开始开始编写项目代码

感谢阅读~

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

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

相关文章

设计模式行为型——备忘录模式

目录 什么是备忘录模式 备忘录模式的实现 备忘录模式角色 备忘录模式类图 备忘录模式举例 备忘录模式代码实现 备忘录模式的特点 优点 缺点 使用场景 注意事项 实际应用 什么是备忘录模式 备忘录模式&#xff08;Memento Pattern&#xff09;又叫做快照模式&#x…

qt源码---事件系统之QCoreApplication

上一节分析了qt和windows系统之间的消息的传递&#xff0c;本节着重看一下&#xff0c;qt内部的事件是如何传递的&#xff1f; 1.sendEvent函数 在使用的自定义事件时&#xff0c;有时需要手动抛出一个事件&#xff0c;常用的方式有2种&#xff0c;其一时阻塞式的sendEvent函…

在IDEA同一个窗口中同时打开多个独立项目

文章说明 本文主要说明如何在Intellij Idea中同时打开多个独立的Maven项目。 我在使用idea的时候&#xff0c;由于自己负责了很多项目&#xff0c;经常要在不通的代码之间切换来切换去。然后搜索代码的时候也只能搜到当前打开的这个项目。因为这个原因&#xff0c;一些小项目…

wxwidgets Ribbon使用wxRibbonToolBar实例

wxRibbonToolBar就是工具栏&#xff0c;一下是实现的效果&#xff0c;界面只是功能展示&#xff0c;没有美化 实现代码如下所示&#xff1a; MyFrame::MyFrame(const wxString& title) : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(800, 600)) …

vue中点击添加类名,并且实现升降序

1.介绍 要求&#xff1a;掌握indexOf()用法&#xff1b;动态绑定类名的对象写法&#xff1b;iconfont使用&#xff1b;split()用法&#xff1b;三元运算符用法&#xff1b;es6模板字符串&#xff1b; 说明&#xff1a;首先综合元素默认有元素并且是降序。服务器传来的数据格式…

C++物理引擎Box2D的下载,编译,VS2013配置环境

文章目录 网站和下载地址编译工具:编译box2dhelloworld测试网站和下载地址 https://box2d.org/ 下载地址 https://hub.nuaa.cf/erincatto/box2d/tags 编译工具: 1.VS2013 2.cmake 下载地址 https://cmake.org/ 编译box2d 下载box2d源码2.4.0,解压。在box2d-2.4.0目录下…

什么是场景营销,小红书场景营销方式和方法有哪些

现在小红书上最流行的就是场景营销&#xff0c;那什么是场景营销&#xff0c;应该怎么做呢&#xff1f;今天来和大家分享下大家都在说得场景营销是什么&#xff0c;在小红书投放怎么做好场景营销&#xff1f; 一、什么是场景化营销 说白来&#xff0c;场景营销(Scene Marketing…

机器学习深度学习——从全连接层到卷积

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——非NVIDIA显卡怎么做深度学习&#xff08;坑点排查&#xff09; &#x1f4da;订阅专栏&#xff1a;机器…

Python测试框架pytest:测试用例、查找子集、参数化、跳过

Pytest是一个基于python的测试框架&#xff0c;用于编写和执行测试代码。pytest主要用于API测试&#xff0c;可以编写代码来测试API、数据库、UI等。 pytest是一个非常成熟的全功能的Python测试框架&#xff0c;主要有以下几个优点&#xff1a; 简单灵活&#xff0c;容易上手。…

react搭建在线编辑html的站点——引入grapes实现在线拖拉拽编辑html

文章目录 ⭐前言⭐搭建react ts项目⭐引入grapes 插件⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享关于react搭建在线编辑html的站点。 react 发展历史 React是由Facebook开发的一种JavaScript库&#xff0c;用于构建用户界面。React最初发布于2013年&…

没有配置redis但是报错连接redis失败

问题 没有配置redis但是报错连接redis失败 检查maven配置是否引入了redis依赖&#xff08;可能是传递依赖&#xff0c;最好检查引进来的公共工程 解决办法 只需要在该工程application.yml文件中配置一下 redis就好&#xff0c;或者移除redis依赖 spring:redis:password: hos…

一文了解 Android Auto 车载开发~

作者&#xff1a;牛蛙点点申请出战 背景 我的的产品作为一个海外音乐播放器&#xff0c;在车载场景听歌是一个很普遍的需求。在用户反馈中&#xff0c;也有很多用户提到希望能在车上播放音乐。同时车载音乐也可以作为提升用户消费时长一个抓手。 出海产品&#xff0c;主要服务…

【Vue】Parsing error: No Babel config file detected for ... vue

报错 Parsing error: No Babel config file detected for E:\Study\Vue网站\实现防篡改的水印\demo02\src\App.vue. Either disable config file checking with requireConfigFile: false, or configure Babel so that it can find the config files.             …

玩机搞机---安卓新机型payload.bin刷写救砖 无需专用线刷包

目前的新机型官方卡刷包解包后都是payload.bin分区格式的卡刷固件。而有个别一些机型没有线刷包&#xff0c;当这些机型出现系统问题的时候有以下几种方法参考救砖。遇到类似故障的朋友可以借鉴参考下. 其中的不足和相关的资源可以参考这两个博文。任何教程的目的只是拓展你的…

反射调用private方法的坑

使用反射调用私有方法时&#xff0c;发现空指针异常&#xff0c;无法直接注入导致空指针异常 加入如下代码后&#xff0c;恢复正常 if (AopUtils.isCglibProxy(marketSmsTaskService)) {// 如果是cglib代理对象&#xff0c;则转为原始对象marketSmsTaskService (MarketSmsTas…

SpringBoot3基础用法

技术和工具「!喜新厌旧」 一、背景 最近在一个轻量级的服务中&#xff0c;尝试了最新的技术和工具选型&#xff1b; 即SpringBoot3&#xff0c;JDK17&#xff0c;IDEA2023&#xff0c;Navicat16&#xff0c;虽然新的技术和工具都更加强大和高效&#xff0c;但是适应采坑的过程…

React安装ant design组件库,并使用

ant design是一个很棒的组件库&#xff0c;官方地址&#xff1a;快速上手 - Ant Design 但是如何在React里面用起来&#xff0c;好像并不是很顺畅&#xff0c;没有像Vue里面那么友好&#xff0c;因为我踩过这个坑&#xff0c;虽然安装很简单&#xff0c;但是想要出样式&#x…

地球人口承载力估计 解析和C++代码

Description 假设地球上的新生资源按恒定速度增长。照此测算&#xff0c;地球上现有资源加上新生资源可供x亿人生活a年&#xff0c;或供y亿人生活b年。 为了能够实现可持续发展&#xff0c;避免资源枯竭&#xff0c;地球最多能够养活多少亿人&#xff1f; Input 一行&#xf…

[数据分析与可视化] Python绘制数据地图4-MovingPandas入门指北

MovingPandas是一个基于Python和GeoPandas的开源地理时空数据处理库&#xff0c;用于处理移动物体的轨迹数据。它提供了一组强大的工具&#xff0c;可以轻松地加载、分析和可视化移动物体的轨迹。通过使用MovingPandas&#xff0c;用户可以轻松地处理和分析移动对象数据&#x…

C语言假期作业 DAY 15

一、选择题 1、有如下代码&#xff0c;则 *(p[0]1) 所代表的数组元素是&#xff08; &#xff09; int a[3][2] {1, 2, 3, 4, 5, 6}, *p[3]; p[0] a[1]; A: a[0][1] B: a[1][0] C: a[1][1] D: a[1][2] 答案解析 正确答案&#xff1a; C p 是一个指针数组&#xff0c; p[0] a…