【C++項目實戰】:基于正倒排索引的Boost搜索引擎(1)

1. 項目的相關背景與目標

針對boost網站沒有搜索導航功能,為boost網站文檔的查找提供搜索功能
站內搜索:搜索的數據更垂直,數據量小
類似于cplusplus.com的搜索
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

2.搜索引擎的相關宏觀原理

在這里插入圖片描述

3.技術棧和項目環境

技術棧:C/C++,C++11,STL,準標準庫Boost(相關文件操作),jsoncpp(客戶端和數據端數據交互),cppjieba(將搜索關鍵字進行切分),cpp-httplib(構建http服務器)
其他技術棧(前端):html5,css,js,jQuery,Ajax
項目環境:Centos 7云服務器,vim/gcc(g++)/Makefile,vs2019/vs code(網頁)

4. 正排索引、倒排索引

正排索引:從文檔ID找到文檔內容(文檔內的關鍵字)
正排索引類似于書的目錄,我們可以根據頁數查找到對應的內容

目標文檔進行分詞:目的:方便建立倒排索引和查找
停止詞:了,嗎,的,the,a,一般情況我們在分詞的時候可以不考慮

倒排索引:根據文檔內容,分詞,整理不重復的各個關鍵字,對應聯系到文檔ID的方案
文檔ID中,各個文檔ID的排序按照權重進行排序
倒排索引和正排索引是相反的概念,我們可以根據文檔內容查詢到這部分內容在哪些文件中出現,從而找到對應的文件

模擬查找過程
用戶輸入:
關鍵字->倒排索引中查找->提取出是文檔ID(x,y,z,,,)->根據正排索引->找到文檔的內容->將文檔內容中的title+conent(desc)+url+文檔結果進行摘要->構建響應結果
在這里插入圖片描述

5.編寫數據去標簽與數據清洗的模塊Parser

在這里插入圖片描述

boost 官?: https://www.boost.org/
//?前只需要boost_1_78_0/doc/html?錄下的html?件,?它來進?建?索引

去標簽

[@VM-0-3-centos boost_searcher]$ touch parser.cc
//原始數據 -> 去標簽之后的數據
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html> <!--這是?個標簽-->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Chapter 30. Boost.Process</title>
<link rel="stylesheet" href="../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
<link rel="home" href="index.html" title="The Boost C++ Libraries BoostBook
Documentation Subset">
<link rel="up" href="libraries.html" title="Part I. The Boost C++ Libraries
(BoostBook Subset)">
<link rel="prev" href="poly_collection/acknowledgments.html"title="Acknowledgments">
<link rel="next" href="boost_process/concepts.html" title="Concepts">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084"alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86"src="../../boost.png"></td>
<td align="center"><a href="../../index.html">Home</a></td>
<td align="center"><a href="../../libs/libraries.htm">Libraries</a></td>
<td align="center"><a href="http://www.boost.org/users/people.html">People</a>
</td>
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
<td align="center"><a href="../../more/index.htm">More</a></td>
</tr></table>
.........
// <> : html的標簽,這個標簽對我們進?搜索是沒有價值的,需要去掉這些標簽,?般標簽都是成對出現的!
[@VM-0-3-centos data]$ mkdir raw_html
[@VM-0-3-centos data]$ lltotal 20
drwxrwxr-x 60 16384 Mar 24 16:49 input //這?放的是原始的html?檔
drwxrwxr-x 2 4096 Mar 24 16:56 raw_html //這是放的是去標簽之后的?凈?檔
[@VM-0-3-centos input]$ ls -Rl | grep -E '*.html' | wc -l
8141
?標:把每個?檔都去標簽,然后寫?到同?個?件中!每個?檔內容不需要任何\n!?檔和?檔之間
? \3 區分version1:
類似:XXXXXXXXXXXXXXXXX\3YYYYYYYYYYYYYYYYYYYYY\3ZZZZZZZZZZZZZZZZZZZZZZZZZ\3
采?下?的?案:
version2: 寫??件中,?定要考慮下?次在讀取的時候,也要?便操作!
類似:title\3content\3url \n title\3content\3url \n title\3content\3url \n ...
?便我們getline(ifsream, line),直接獲取?檔的全部內容:title\3content\3url

編寫parser

//代碼的基本結構:
#include <iostream>
#include <string>
#include <vector>
//是?個?錄,下?放的是所有的html??
const std::string src_path = "data/input/";const std::string output = "data/raw_html/raw.txt";
typedef struct DocInfo{
std::string title; //?檔的標題
std::string content; //?檔內容
std::string url; //該?檔在官?中的url
}DocInfo_t;
//const &: 輸?
//*: 輸出
//&:輸?輸出
bool EnumFile(const std::string &src_path, std::vector<std::string>
*files_list);
bool ParseHtml(const std::vector<std::string> &files_list,
std::vector<DocInfo_t> *results);
bool SaveHtml(const std::vector<DocInfo_t> &results, const std::string
&output);
int main()
{
std::vector<std::string> files_list;//第?步: 遞歸式的把每個html?件名帶路徑,保存到files_list中,?便后期進??個?個的
?件進?讀取
if(!EnumFile(src_path, &files_list)){
std::cerr << "enum file name error!" << std::endl;
return 1;
}
//第?步: 按照files_list讀取每個?件的內容,并進?解析
std::vector<DocInfo_t> results;
if(!ParseHtml(files_list, &results)){
std::cerr << "parse html error" << std::endl;
return 2;
}
//第三步: 把解析完畢的各個?件內容,寫?到output,按照\3作為每個?檔的分割符if(!SaveHtml(results, output)){
std::cerr << "sava html error" << std::endl;
return 3;
}
return 0;
}
bool EnumFile(const std::string &src_path, std::vector<std::string>
*files_list)
{
return true;
}
bool ParseHtml(const std::vector<std::string> &files_list,
std::vector<DocInfo_t> *results)
{
return true;
}
bool SaveHtml(const std::vector<DocInfo_t> &results, const std::string &output)
{
return true;
}

Boost開發庫的安裝

[whb@VM-0-3-centos boost_searcher]$ sudo yum install -y boost-devel //是boost 開
發庫

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
目標:
把每個文檔都去標簽,然后寫入到同一個文件中,每個文檔內容只占一行!文檔和文檔之間‘\3’區分
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/73474.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/73474.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/73474.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

汽車高級駕駛輔助系統應用存儲MRAM

高級駕駛輔助系統和先進的互連航空電子技術等應用要求元件能夠承受惡劣的環境條件&#xff0c;并具有較高的耐用性。閃存雖然在某些條件下性能可靠&#xff0c;但在耐用性方面存在局限性&#xff0c;因此無法滿足這些嚴格的要求。 在實時傳感器數據處理或高可靠性通信等對時間…

藍橋-班級活動

問題描述 小明的老師準備組織一次班級活動。班上一共有 n 名 (n 為偶數) 同學&#xff0c;老師想把所有的同學進行分組&#xff0c;每兩名同學一組。為了公平&#xff0c;老師給每名同學隨機分配了一個 n 以內的正整數作為 id&#xff0c;第 i 名同學的 id 為 ai?。 老師希望…

MongoDB 的索引是提高查詢性能的核心機制,類似于傳統關系型數據庫的索引。以下是對 MongoDB 索引的詳細說明:

MongoDB 的索引是提高查詢性能的核心機制&#xff0c;類似于傳統關系型數據庫的索引。以下是對 MongoDB 索引的詳細說明&#xff1a; 一、索引基礎 1. 索引的作用 加速查詢&#xff1a;通過索引快速定位數據&#xff0c;避免全集合掃描&#xff08;COLLSCAN&#xff09;。 排…

深入理解指針(1)(C語言版)

文章目錄 前言一、內存和地址1.1 內存1.2 究竟該如何理解編址 二、指針變量和地址2.1 取地址操作符&2.2 指針變量和解引用操作符*2.2.1 指針變量2.2.2 如何拆解指針類型2.2.3 解引用操作符 2.3 指針變量的大小 三、指針變量類型的意義3.1 指針的解引用3.2 指針-整數3.3 voi…

【視頻】m3u8相關操作

【視頻】郭老二博文之:圖像視頻匯總 1、視頻文件轉m3u8 1.1 常用命令 1)默認只保留 5 個ts文件 ffmpeg -i input.mp4 -start_number 0 -hls_time 10 -hls_list_size 0 -f hls stream1.m3u82)去掉音頻 -an,保留全部ts文件 ffmpeg -i input.mp4 -vf scale=640:480 -an -…

AWS CloudWatch 實戰:構建智能監控與自動化運維體系

摘要&#xff1a;本文通過實際案例&#xff0c;詳細講解如何利用AWS CloudWatch實現云端資源的實時監控、日志分析與自動化運維&#xff0c;助力企業提升系統穩定性與運維效率 一、場景痛點分析 某電商平臺遷移至AWS后面臨三大挑戰&#xff1a; 故障響應滯后&#xff1a;服務器…

第一天學爬蟲

閱讀提示&#xff1a;我今天才開始嘗試爬蟲&#xff0c;寫的不好請見諒。 一、準備工具 requests庫&#xff1a;發送HTTP請求并獲取網頁內容。BeautifulSoup庫&#xff1a;解析HTML頁面并提取數據。pandas庫&#xff1a;保存抓取到的數據到CSV文件中。 二、爬取步驟 發送請求…

網絡編程和計算機網絡五層模型的關系

計算機網絡的五層模型&#xff08;應用層、傳輸層、網絡層、鏈路層和物理層&#xff09;為網絡編程提供了基礎框架和通信機制。網絡編程就是在這些層次上實現應用程序之間的通信。 計算機網絡五層模型 &#xff08;1&#xff09;應用層&#xff1a; 作用&#xff1a;應用層是…

知識篇 | Oracle的 TEMP表空間管理和優化

Oracle臨時表空間&#xff08;TEMP&#xff09;是數據庫中用于存儲會話級臨時數據的核心組件&#xff0c;主要用于支持需要中間結果集的操作&#xff08;如排序、哈希連接&#xff09;。其數據在事務結束或會話終止后自動釋放&#xff0c;不持久化存儲。 核心特點&#xff1a;…

重學Java基礎篇—線程池參數優化指南

一、核心參數解析 線程池&#xff08;ThreadPoolExecutor&#xff09;的性能取決于以下關鍵參數&#xff1a; 參數說明corePoolSize核心線程數&#xff0c;即使空閑也不會被回收maximumPoolSize最大線程數&#xff0c;當隊列滿且核心線程忙時創建新線程workQueue任務隊列&…

記一次線上環境JAR沖突導致程序報錯org.springframework.web.util.NestedServletException

一、問題描述 有個文件導入功能&#xff0c;用到了Hutool 的加密解密功能&#xff0c;本地運行完全可以&#xff0c;但是線上報錯&#xff1a;“org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoClassDefFou…

怎么快速部署Sock5代理到ubuntu云服務器

使用 Dante (推薦) 1. 安裝 Dante bash Copy sudo apt update sudo apt install dante-server -y 2. 配置 Dante 編輯配置文件 /etc/danted.conf&#xff1a; bash Copy sudo nano /etc/danted.conf 替換為以下內容&#xff08;按需修改端口和認證&#xff09;&#…

華為OD機試2025A卷 - 游戲分組/王者榮耀(Java Python JS C++ C )

最新華為OD機試 真題目錄:點擊查看目錄 華為OD面試真題精選:點擊立即查看 題目描述 2020年題: 英雄聯盟是一款十分火熱的對戰類游戲。每一場對戰有10位玩家參與,分為兩組,每組5人。每位玩家都有一個戰斗力,代表著這位玩家的厲害程度。為了對戰盡可能精彩,我們需要…

OpenRAND可重復的隨機數生成庫

OpenRAND 是一個 C++ 庫,旨在通過提供強大且可復制的隨機數生成解決方案來促進可重復的科學研究。它是一個簡單的僅頭文件庫,性能可移植,統計穩健,并且易于集成到任何 HPC 計算項目中。 特征 跨平臺支持:OpenRAND 旨在跨各種平臺無縫工作,包括 CPU 和 GPU。其僅標題庫設計…

接口/UI自動化面試題

一、UI自動化 1.1、接口和UI自動化有多少用例&#xff1f; 回答策略&#xff1a;根據接口設定用例&#xff0c;100個接口&#xff0c;自動化case在1500-2000左右。結合自身的項目&#xff0c;回答覆蓋的主功能流程。 示例&#xff1a; 接口自動化的測試case一般需要根據接口數…

使用Docker部署RabbitMQ

第一步&#xff1a;安裝 RabbitMQ # 1. 拉取鏡像 docker pull rabbitmq:3.12.0-management# 2. 啟動容器&#xff08;開放端口 數據持久化&#xff09; docker run -d \--nameshare_rabbitmq \-p 5672:5672 \ # AMQP 協議端口-p 15672:15672 \ # 管理界面端口…

2.基于多線程的TCP服務器實現

目錄 1. 簡單分析之前的代碼 2. 多線程服務器設計 2.1 C11線程的基本使用 2.2 服務器主體邏輯 3. 錯誤處理的封裝 4. 完整的代碼實現 客戶端代碼&#xff08;client.cpp&#xff09; 服務器代碼&#xff08;server.cpp&#xff09; 5. 運行方式 在我們預想中&#xff…

Python Web 框架 Django、Flask 和 FastAPI 對比

在探索 Python Web 框架時&#xff0c;Django、Flask 和 FastAPI 無疑是最常被提及的名字。根據我們最新的 Python 開發者調查&#xff0c;這三大框架繼續穩坐后端 Web 開發的熱門寶座。它們均為開源項目&#xff0c;并且與 Python 的最新版本無縫兼容。然而&#xff0c;面對不…

SQL Server數據庫表刪除分區

在 SQL Server 中刪除分區并將表恢復到非分區狀態&#xff0c;需按以下步驟操作&#xff1a; 一、合并所有分區 1. 檢查現有分區結構 首先確認表的分區方案和分區函數&#xff1a; -- 查看分區方案 SELECT * FROM sys.partition_schemes;-- 查看分區函數 SELECT * FROM sys…

信息安全和病毒防護——安全協議關于SSL和TLS協議的補充說明

文章目錄 SSL與TLS的關系SSL與TLS的核心區別SSL/TLS的典型應用安全建議總結SSL與TLS的關系 SSL(Secure Sockets Layer,安全套接層)和TLS(Transport Layer Security,傳輸層安全)是同一技術體系的演進版本,而非完全獨立的協議。其發展歷程如下: SSL 1.0(1994):未公開…