C++项目:基于boost在线文档实现的搜索引擎(二)
上一篇:C++项目:基于boost在线文档实现的搜索引擎(一)
下一篇:C++项目:基于boost在线文档实现的搜索引擎(三)
github: https://github.com/duchenlong/boost-search-engine
通过之前的预处理的过程,我们将boost在线文档都进行了分解,得到了每一个html在线文档分词后的结果(title,url,content)
之后我们就需要将正文进行拆分,为正文的每一个关键字建立一个索引,方便我们之后的搜索过程,这里可以使用C++STL中的哈希表,也就是unordered_map
这里我们需要完成
倒排索引的建立,倒排索引与正排索引进行搜索文本的查找
索引模块
对于索引模块,也就是我们需要构建倒排索引
也就是需要提取关键字对指定文本进行分词,这一过程叫做倒排索引。他的核心就是根据一个词,映射到这个词所属的文档中(哈希表)

正排索引:根据文档id,得到文档的内容倒排索引:根据文档的内容,得到文档的id
为了对每一个倒排索引与正排索引的关键字进行描述,我们给他们各自封装一个结构体:
/*
* 正排索引的存储结构体
* 根据文档 id 定位到文档的内容
* 防止文档过多,直接使用64位的 int 来存储
*/
struct frontIdx{
int64_t _docId;
string _title;
string _url;
string _content;
};
/*
* 倒排索引存储的结构体
* 根据文本的关键字 定位到 所属的文档Id
* 为了后面根据权值排序,再加一个关键字的权值
*/
struct backwardIdx{
int64_t _docId;
int _weight;
string _word;
};
索引模块的描述
我们的索引模块会有两次使用的地方:
- 第一次就是我们启动服务器的时候,自动对指定目录下的所有 html文档进行分词,建立索引
- 第二次就是我们进行查找的时候,这时进行分词的就是我们的搜索内容,并对这个内容进行分词,正排索引与倒排索引。
这其中会有一些公共的代码块,所以我们可以对索引的地方进行封装,构建一个类Index来进行这一模块的描述:

class Index{
public:
Index();
//查找正排索引
const frontIdx* GetFrontIdx(const int64_t doc_id);
//查倒排索引
const vector<backwardIdx>* GetBackwardIdx(const string& key);
// 建立倒排索引 与 正排索引
bool Build(const string& input_path);
// jieba分词 对语句进行分词
void CutWord(const string& input,vector<string>* output);
private:
//根据一行 预处理 解析的文件,得到一个正排索引的节点
frontIdx* BuildForward(const string& line);
//根据正排索引节点,构造倒排索引节点
void BuildInverted(const frontIdx& doc_info);
private:
//正排索引
vector<frontIdx> forward_index;
//倒排索引 哈希表
unordered_map<string,vector<backwardIdx> > inverted_index;
// jieba分词
cppjieba::Jieba jieba;
};
正排索引与倒排索引的建立
首先,我们在建立索引的时候,所传的参数是预处理中存储文档进行解析后数据的文件的路径,这个路径中,一行即是一组数据,他的排列为 title\3url\3content\n。

所以在建立索引之前,我们需要进入这个文件中,然后一行一行的将所有html文档中的数据都读取了
在得到一个文档解析的数据后,我们需要得到单独的 title,url,content。因为他们中间被我们用特殊的符号\3分割开,我们可以使用split函数进行分割,而C++的STL中并没有实现这个函数,就借助与Boost中的split函数来实现一些。
boost::split(type, select_list, boost::is_any_of(","), boost::token_compress_on);
-
type类型是std::vectorstd::string,用于存放切割之后的字符串 -
select_list:传入的字符串,可以为空。 -
boost::is_any_of(","):设定切割符为,(逗号) -
boost::token_compress_on:将连续多个分隔符当一个,默认没有打开,当用的时候一般是要打开的。
boost:: token_compress_off:不会压缩分割结果,连续的分隔符时会返回""字符

该博客介绍了如何使用C++和boost库构建搜索引擎的索引模块,包括正排索引和倒排索引的建立。通过jieba分词对文档进行预处理,利用哈希表和split函数处理数据,实现快速查找。文章还讨论了索引测试和权值计算策略。
最低0.47元/天 解锁文章
3219

被折叠的 条评论
为什么被折叠?



