C++项目:基于boost在线文档实现的搜索引擎(二)

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

上一篇:C++项目:基于boost在线文档实现的搜索引擎(一)
下一篇:C++项目:基于boost在线文档实现的搜索引擎(三)
github: https://github.com/duchenlong/boost-search-engine

通过之前的预处理的过程,我们将boost在线文档都进行了分解,得到了每一个html在线文档分词后的结果(titleurlcontent

之后我们就需要将正文进行拆分,为正文的每一个关键字建立一个索引,方便我们之后的搜索过程,这里可以使用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;
    };

索引模块的描述

我们的索引模块会有两次使用的地方:

  1. 第一次就是我们启动服务器的时候,自动对指定目录下的所有 html文档进行分词,建立索引
  2. 第二次就是我们进行查找的时候,这时进行分词的就是我们的搜索内容,并对这个内容进行分词,正排索引与倒排索引。

这其中会有一些公共的代码块,所以我们可以对索引的地方进行封装,构建一个类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文档中的数据都读取了

在得到一个文档解析的数据后,我们需要得到单独的 titleurlcontent。因为他们中间被我们用特殊的符号\3分割开,我们可以使用split函数进行分割,而C++的STL中并没有实现这个函数,就借助与Boost中的split函数来实现一些。

boost::split(type, select_list, boost::is_any_of(","), boost::token_compress_on);
  1. type类型是std::vectorstd::string,用于存放切割之后的字符串

  2. select_list:传入的字符串,可以为空。

  3. boost::is_any_of(","):设定切割符为,(逗号)

  4. boost::token_compress_on:将连续多个分隔符当一个,默认没有打开,当用的时候一般是要打开的。
    boost:: token_compress_off:不会压缩分割结果,连续的分隔符时会返回 ""字符

评论 15
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值