Skip to content

Lp700750/BoostSearch

Repository files navigation

boostSearch

0 前言

在使用C++这门语言进行编程的过程当中,必然少不了对于各种库的使用,其中最出名用的最多的当中就属于STL了,他给C++编程人员减少了不少的麻烦,但是随着时间的推移,人们对于需求的增多,对于库的需求也慢慢的增加,但是由于STL库更新速度较慢,某些其他的语言库逐渐被使用,这里面体谅感比较好的就是boost库,但是当我们真正的进入boost库官网,会发现这个库里面的文件会很多,但是对于它们的搜索却没有,这无疑对C++的开发人员来说很苦恼,据此做一个搜索框来提高对于里面库的查找体验。

1 难点内容解析

Boost结构图 drawio

1.1 大纲介绍

  1. Parse.cpp 主要是对原始的Boost当中各种库进行解析,将所有的库Html里面的内容输出为字符串的形式
  2. Index.hpp 主要是解析出来的每一个Html进行构建正排和倒排索引
  3. Search.hpp 主要是通过关键句来进行查找对应的关键词在那个Html当中出现
  4. Tool.hpp 主要是各种通用“工具”类函数
  5. Debug.cpp 主要是用来进行调试,便于发现问题

1.2 Parse

这部分的主要功能主要有三个,第一步先将boost库里面的所有的库文件(.html)全部找出来;第二步就是将读取相应的.html文件,将文件里面的文件标题,文件的内容,文件的网址全部都提取出来;第三步将提取出来的文件保存在相应的文件里面,为下一步使用做准备。

1.2.1 saveFile

这里首先需要定义一个结构体,便于后面解析出来的内容进行存储

typedef struct DocInfo
{
  std::string title;
  std::string content;
  std::string url;
}doc_t;

下面这个就是该解析函数,它的主要功能就是对传入的文件srcdata文件夹进行检查,看他是否符合要求的文件,如果是的话就把该文件(带有路径)存放到destdata文件里面,便于后面进行解析文件里面的内容。

bool saveFile(const std::string& srcdata,std::vector<std::string>* destdata);

需要注意的是,它里面的对于文件是否存在,文件的迭代查询采用的都是boost内部自带的库函数

1.2.2 parseHtml

bool parseHtml(const std::vector<std::string>& _fileList,std::vector<doc_t>* _results);
static bool parseTitle(const std::string& result,std::string* title);
static bool parseContent(const std::string& result,std::string* content);
static bool parseUrl(const std::string& file,std::string* url);

这部分的功能就是将上面解析出来的文件进行读取,然后分别将每一个文件内部的title,content,url进行解析获取然后保存于上面提到的DocInfo,然后以DocInfo为单位将每一份解析完文件保存于_results当中,便于后面的第三步操作。

1.2.3 saveHtml

bool saveHtml(const std::vector<doc_t>& doc,const std::string& output);

这部分的内容相较于来说比较简单,它的主要功能就是对上面解析好的文件进行文件输出。

1.3 Index.hpp

这一部分的主要作用就是对文档进行正排与倒排的索引的过程

  • 正排索引:正向的来进行索引,在本文当中就是采用文档的编号来找到对应的文档
  • 倒排索引:反过来进行索引,在本文当中就是通过文档的关键词来找到倒排索引,有倒排索引找到文档的编号,再由编号进行正排索引找到其对应的文档

1.3.1 BuildIndex

这部分的主要作用就是对第一阶段解析好的文件进行输入,由于上面解析时将所有的文档内容都解析到一个txt的文件当中,将输入的结果全部进行正向索引解析成一个一个的结构体,每一个结构体都是里面包含有每一个文档的标题内容网址,同时在进行倒排索引,将每一个文档里面内容进行分词,然后将每一个词进行词频统计(这里的词频统计分为标题的词频统计和内容的词频统计,其中标题的词频在最终的结果当中所占的权值更大)

1.3.2 buildForwardIndex

将输入的字符串(该字符串包含有该文档的标题内容网址三个部分,其中每部分中间由"\3"进行分割,便于后面进行分割)进行分割,得到每一份文档的标题内容网址。

1.3.3 buildInvertedIndex

将上面正排索引输出的每一个文档进行词频统计,便于后面进行排序

1.4 search

这部分的主要作用就是对用户输入的关键词进行搜索,然后对搜索的结果进行排序传给前端

1.4.1 search

  • 对输入的关键词进行分词
  • 对分完之后的每一个关键词都进行index索引,这里需要注意的是对于关键词索引出来相同的文档时,这里需要将里面的关键词进行合并,权值进行相加,不然搜索的结果可能会有重复
  • 对搜索出来的结果进行按照权值的大小进行降序处理,便于用户进行查找方便
  • 对搜索出来的结果进行Json序列化,便于传送给前端展示

1.4.2 GetDesc

为了方便用户观看搜查的结果,这里面在内容的展示哪里,会将第一个关键词的前后一定数量的内容进行展示,便于用户观看。