【Boost】:searcher的建立(四)

searcher的建立

  • 一.初始化
  • 二.搜索功能
  • 三.完整源代码

sercher主要分为两部分:初始化和查找。

在这里插入图片描述

在这里插入图片描述

一.初始化

初始化分为两步:1.创建Index对象;2.建立索引

在这里插入图片描述

二.搜索功能

搜索分为四个步骤

  1. 分词;
  2. 触发:根据分词找到对应的文档;
  3. 合并排序:按照权重降序排列;
  4. 构建:根据查找出的结构,拼接成新的网页。

1.分词

因为之前已经写好了分词函数,这里直接使用即可。

在这里插入图片描述

2.触发

跟据分词,获取该分词的所有倒排拉链。

在这里插入图片描述

3.合并排序

汇总查找结果,对查找内容按照相关性进行排序。这里使用了lambda表达式(如果不了解的可以看看我的博客C++11新特性)

在这里插入图片描述

4.构建

对内容进行正排查找。把查找出来的内容构成一个json串,以方便我们进行序列化和反序列化。

首先安装jesoncpp(如果不会使用的,限于篇幅,可以去百度)

在这里插入图片描述

在这里插入图片描述

三.完整源代码

searcher.hpp

#include "index.hpp"
#include <algorithm>
#include <jsoncpp/json/json.h>

namespace ns_searcher
{
  class Searcher
  {
  private:
    ns_index::Index *index; // 供系统查找的接口
  public:
    Searcher()
    {
    }
    ~Searcher()
    {
    }

  public:
    // 初始化
    void InitSearcher(const std::string &input)
    {
      // 1.创建Index对象
      index = ns_index::Index::GetInstance();

      // 2.创建索引
      index->BuildIndex(input);
    }
    // 查找
    void Search(const std::string &query, std::string *json_string)
    {
      // 1.分词
      std::vector<std::string> words; // 存放词
      ns_util::JiebaUtil::CutString(query, &words);

      // 2.触发:根据分词找到对应倒排拉链(注意:要忽略大小写)
      ns_index::InvertedList inverted_list_all; // 存放所有找到的文档的倒排拉链
      for (auto &s : words)
      {
        boost::to_lower(s); // 忽略大小写
        // 为了方便,这里经过了typedef,把倒排hash的second(vector<InvertedElem>)重命名成了InvertedList
        ns_index::InvertedList *inverted_list = index->GetInvertedList(s); // 根据string获取倒排拉链
        if (nullptr == inverted_list)
          continue;
        inverted_list_all.insert(inverted_list_all.end(), inverted_list->begin(), inverted_list->end());
      }

      // 3.进行汇总排序
      std::sort(inverted_list_all.begin(), inverted_list_all.end(), [](ns_index::InvertedElem &e1, ns_index::InvertedElem &e2)
                { e1.weight > e2.weight; });

      // 4.构建jsoncpp串
      Json::Value root;
      for (auto &item : inverted_list_all)
      {
        ns_index::DocInfo *doc = index->GetForwardIndex(item.id); // 通过正排索引获取文档
        if (nullptr == doc)
          continue;
        Json::Value elem;
        elem["title"] = doc->title;
        elem["desc"] = doc->content; // 我们只需要展示一部分内容即可,这里以后会改
        elem["url"] = doc->url;

        root.append(elem);
      }
      Json::StyledWriter writer;
      *json_string = writer.write(root); // 写入目标文件
    }
  };
}

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

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

相关文章

P4071 [SDOI2016] 排列计数 错排,递归公式

错排公式理解&#xff1a; //f(x)表示1~x的错排数目 // //1选择(x-1种&#xff09; //乘以剩下的总数目就是答案。//(1选了2就接着排2了&#xff0c;这样所有的都可以算到&#xff0c;是递归所以难想)// 选2时 // 2可选 1 和 3~x//2选1&#xff0c;对2开始来说此次总数就是1*f(…

Linux权限【超详细】

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 目录 扩展知识&#xff1a…

C++项目 -- 高并发内存池(二)Thread Cache

C项目 – 高并发内存池&#xff08;二&#xff09;Thread Cache 文章目录 C项目 -- 高并发内存池&#xff08;二&#xff09;Thread Cache一、高并发内存池整体框架设计二、thread cache设计1.整体设计2.thread cache哈希桶映射规则3.TLS无锁访问4.thread cache代码 一、高并发…

【数据分享】1米分辨率土地覆盖数据集SinoLC-1

数据链接 SinoLC-1: the first 1-meter resolution national-scale land-cover map of China created with the deep learning framework and open-access data (Update data: August, 2023) (zenodo.org)https://zenodo.org/records/8214467 数据分享 数据分享到了公众号&…

2024/2/4

一&#xff0e;选择题 1、下列不能作为类的成员的是&#xff08;B&#xff09; A. 自身类对象的指针 B. 自身类对象 C. 自身类对象的引用 D. 另一个类的对象 2、假定AA为一个类&#xff0c;a()为该类公有的函数成员&#xff0c;x为该类的一个对象&#xff0c;则访问x对象中…

你今年过年回去吗?

#过年 我是一名21岁刚毕业的大学生&#xff0c;专业是软件技术&#xff0c;主修c#&#xff0c;之前在上海实习了一年&#xff0c;正式工作后来到了深圳&#xff0c;进入了一家电商公司实习。至于我为什么转行了&#xff0c;大家懂的都懂 现在是20240203晚上19.39&#xff0c;还…

WordPress Plugin HTML5 Video Player SQL注入漏洞复现(CVE-2024-1061)

0x01 产品简介 WordPress和WordPress plugin都是WordPress基金会的产品。WordPress是一套使用PHP语言开发的博客平台。该平台支持在PHP和MySQL的服务器上架设个人博客网站。WordPress plugin是一个应用插件。 0x02 漏洞概述 WordPress Plugin HTML5 Video Player 插件 get_v…

2024美赛数学建模F题思路源码

赛题目的 赛题目的&#xff1a; 问题描述&#xff1a; 解题的关键&#xff1a; 问题一. 问题分析 问题解答 问题二. 问题分析 问题解答 问题三. 问题分析 问题解答 问题四. 问题分析 问题解答 问题五. 问题分析 问题解答

华为机考入门python3--(8)牛客8-合并表记录

分类&#xff1a;字典排序 知识点&#xff1a; 将输入转成int的列表 my_list list(map(int, input().strip().split( ))) 将列表转为元组 tuple(my_list) 访问元素为元组的列表 for first, second, third in my_list: 对字典进行排序 sorted(my_dict.items())…

微软Azure-OpenAI 测试调用及说明

本文是公司在调研如何集成Azure-openAI时&#xff0c;调试测试用例得出的原文&#xff0c;原文主要基于官方说明文档简要整理实现 本文已假定阅读者申请部署了模型&#xff0c;已获取到所需的密钥和终结点 变量名称值ENDPOINT从 Azure 门户检查资源时&#xff0c;可在“密钥和…

【C语言】static关键字的使用

目录 一、静态本地变量 1.1 静态本地变量的定义 1.2 静态本地变量和非静态本地变量的区别 二、静态函数 2.1 静态函数的定义 2.2 静态函数与非静态函数的区别 三、静态全局变量 3.1 静态全局变量的定义 3.2 静态全局变量和非静态全局变量的区别 四、静态结构体变量 …

【C++入门学习指南】:函数重载提升代码清晰度与灵活性

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; C入门到进阶 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一、函数重载1.1 函数重载的概念1.2 函数重载的作用1.3 C支持函数重载的原理1.4 扩展 &…

寒假作业-day3

1>请编程实现双向链表的头插&#xff0c;头删、尾插、尾删 请编程实现双向链表按任意位置插入、删除、修改、查找 代码&#xff1a; #include<stdio.h> #include<stdlib.h> #include<string.h>typedef int datatype; typedef struct Node{datatype data…

PHP入门指南:起步篇

PHP入门指南&#xff1a;起步篇 PHP入门指南&#xff1a;起步篇什么是PHP&#xff1f;PHP 的优点PHP 开发环境搭建选择本地服务器软件包安装PHP环境配置Web服务器和PHP测试PHP安装 第一个PHP脚本PHP基础语法标记注释变量数据类型常量条件语句循环函数 PHP入门指南&#xff1a;起…

python算法与数据结构---动态规划

动态规划 记不住过去的人&#xff0c;注定要重蹈覆辙。 定义 对于一个模型为n的问题&#xff0c;将其分解为k个规模较小的子问题&#xff08;阶段&#xff09;&#xff0c;按顺序求解子问题&#xff0c;前一子问题的解&#xff0c;为后一子问题提供有用的信息。在求解任一子…

【MySQL】- 09 Select Count

【MySQL】- 09 Select Count 1认识COUNT2 COUNT(列名)、COUNT(常量)和COUNT(*)之间的区别3 COUNT(*)的优化 4 COUNT(*)和COUNT(1)5 COUNT(字段)总结 数据库查询相信很多人都不陌生&#xff0c;所有经常有人调侃程序员就是CRUD专员&#xff0c;这所谓的CRUD指的就是数据库的增删…

产业热点 | 从 Vision Pro 发售,洞见空间计算时代新机遇

*图源&#xff1a;Apple 官网 近日首批 Vision Pro 启动预约发售&#xff0c;短短一周就预估售出 20 万台&#xff0c;如今正式发售在即&#xff0c;再度受到各界的热切关注。 *图源&#xff1a;Apple 官网 同样作为空间计算赛道企业&#xff0c;ALVA Systems 在过去十余年始…

IP数据云识别真实IP与虚假流量案例

随着互联网的普及&#xff0c;企业在数字领域面临着越来越复杂的网络威胁。为了保护网站免受虚假流量和恶意攻击的影响&#xff0c;许多企业正在采用IP数据云。本文将结合一个真实案例&#xff0c;深入探讨IP数据云如何成功准确地识别真实用户IP和虚假流量IP&#xff0c;提高网…

ESU毅速丨3D打印技术引领模具制造创新革命

随着科技的飞速发展&#xff0c;3D打印技术已经成为制造业的新宠。而在模具制造领域&#xff0c;3D打印技术更是带来了巨大的创新价值&#xff0c;引领着模具制造的革命性变革。 传统模具制造过程中&#xff0c;需要经过多道繁琐工序&#xff0c;而3D打印技术简化了这一过程。3…

python接口自动化(五)--接口测试用例和接口测试报告模板(详解)

简介 当今社会在测试领域&#xff0c;接口测试已经越来越多的被提及&#xff0c;被重视&#xff0c;而且现在好多招聘信息要对接口测试提出要求。区别于传统意义上的系统级别测试&#xff0c;很多测试人员在接触到接口测试的时候&#xff0c;也许对测试执行还可以比较顺利的上手…