# index_box 提供搜索功能的实现
- 持有std::vector<ITEM> _buffer; 存储所有文章信息
- 持有ForwardIndex _forward_index;
    - _forward_index.build_findex( _buffer )
    - get_all_items _forward_index.get_all_items
    - get_items _forward_index.get_items(docid_vect, result, filters);
    - get_item _forward_index.get_item
- 持有InvertedIndex _inverted_index;
    - _inverted_index.build_iindex( _forward_index.get_forword_index() );
    - search _inverted_index.trigger(docid_result, working_vect, docid_set, user_profile, search_params);

# ForwardIndex 正排索引(正向索引)
- 持有boost::unordered_map<uint64_t, ITEM> _id2docitem
- 持有boost::unordered_map<uint64_t, filter_t> _id2filter;
- 持有boost::unordered_map<uint64_t, bool> _blacklist;
- build_findex
    - 已删除的文章从_id2docitem、_id2filter删除,加入到_blacklist
    - 更新黑名单,把已更新的文章从_blacklist删除
    - 已过期文章加入_blacklist,从_id2docitem、_id2filter删除
    - 加入新文章或者更新后的文章到_id2docitem、_id2filter
- get_all_items 返回_id2docitem的数据
- get_item 返回_id2docitem.find
- get_items 处理filters,然后_id2docitem.find
- filter_ids 根据FilterJudge和search_params_t对文章进行过滤

# InvertedIndex 倒排索引(反向索引)
- boost::unordered_map<uint64_t, docid_vect_t > inverted_index_t; 从key到文章数组的映射
- std::vector<inverted_index_t> multi_inverted_index_t; 多个从key到文章数组的映射
- 内置
- build_iindex
    - 建立category、keyword、topic、ventity等到docid的索引
    - 对数据的vector根据打分进行排序
- trigger
    - 构造working_vect,用于整个流程放置文章集
    - 进行一系列的trigger_by_features
        - 从一系列特征找到一系列文章vect
        - 找到的文章进行union_insert,合并到working_vect
    - 进行一系列的trigger_or_keys
        - 基本同trigger_by_features
    - 对working_vect里的文章进行check_intersection,即匹配更多and/no操作,得到最终docid_vect

后端程序员之路 35、Index搜索引擎实现分析4-最终的正排索引与倒排索引的更多相关文章

  1. 后端程序员之路 32、Index搜索引擎实现分析1-类的设计

    # 1.forward_index 正排索引(正向索引)- filter_t- filter_judge # 2.inverted_index 倒排索引(反向索引)- inverted_pre_sco ...

  2. 后端程序员之路 33、Index搜索引擎实现分析2-对外接口和大体流程

    # index_manager的单例是index server对外的唯一接口,part_indexer是index搜索的核心部分,index_manager持有了一组part_indexer. typ ...

  3. 后端程序员之路 34、Index搜索引擎实现分析3-对文章索引的两层分块

    # part_indexer 对文章根据id的hash进行分块索引- 持有 search_index _inc_index[2]; search_index _history_index[2]; 进行 ...

  4. 后端程序员之路 43、Redis list

    Redis数据类型之LIST类型 - Web程序猿 - 博客频道 - CSDN.NEThttp://blog.csdn.net/thinkercode/article/details/46565051 ...

  5. 后端程序员之路 13、使用KNN进行数字识别

    尝试一些用KNN来做数字识别,测试数据来自:MNIST handwritten digit database, Yann LeCun, Corinna Cortes and Chris Burgesh ...

  6. 后端程序员之路 59、go uiprogress

    gosuri/uiprogress: A go library to render progress bars in terminal applicationshttps://github.com/g ...

  7. 后端程序员之路 31、Protocol Buffer

    google/protobuf: Protocol Buffers - Google's data interchange formathttps://github.com/google/protob ...

  8. 后端程序员之路 22、RESTful API

    理解RESTful架构 - 阮一峰的网络日志http://www.ruanyifeng.com/blog/2011/09/restful.html RESTful API 设计指南 - 阮一峰的网络日 ...

  9. 后端程序员之路 16、信息熵 、决策树、ID3

    信息论的熵 - guisu,程序人生. 逆水行舟,不进则退. - 博客频道 - CSDN.NEThttp://blog.csdn.net/hguisu/article/details/27305435 ...

随机推荐

  1. STL_优先队列

    一.简介 优先队列容器与队列一样,只能从队尾插入元素,从队首删除元素.但是它有一个特性,就是队列中最大的元素总是位于队首,所以出队时,并非按照先进先出的原则进行,而是将当前队列中最大的元素出队. 元素 ...

  2. Codeforces Round #604 (Div. 2) C. Beautiful Regional Contest(贪心)

    题目链接:https://codeforces.com/contest/1265/problem/C 题意 从大到小给出 $n$ 只队伍的过题数,要颁发 $g$ 枚金牌,$s$ 枚银牌,$b$ 枚铜牌 ...

  3. HDU 2176 取(m堆)石子游戏 && HDU1850 Being a Good Boy in Spring Festivaly

    HDU2176题意: m堆石子,两人轮流取.只能在1堆中取.取完者胜.先取者负输出No.先取者胜输出Yes,然后输出怎样取子. 通过 SG定理 我们可以知道每一个数的SG值,等于这个数到达不了的前面数 ...

  4. hdu517 Triple

    Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submissio ...

  5. WPF 之命令(七)

    一.前言 ​ 事件的作用是发布和传播一些消息,消息送达接收者,事件的使命也就完成了,至于消息响应者如何处理发送来的消息并不做规定,每个接收者可以使用自己的行为来响应事件.即事件不具有约束力. ​ 命令 ...

  6. OPENSOURCE - libcurl

    本文仅做备份存档,原文地址如下,请点链接进入 https://www.cnblogs.com/moodlxs/archive/2012/10/15/2724318.html https://www.c ...

  7. Zabbix 自动发现 & 自动注册

    自动发现 Zabbix 为用户提供了高效灵活的网络自动发现功能,有以下优点: 加快 Zabbix 部署 简化管理 无需过多管理,也能在快速变化的环境中使用 Zabbix Zabbix 网络发现基于以下 ...

  8. Python——Django框架——Form框架

    一.引入Form包 from django import forms 二.定义规则 class Forms_Login(forms.Form): 用户名 = forms.CharField(requi ...

  9. Java 并发机制底层实现 —— volatile 原理、synchronize 锁优化机制

    本书部分摘自<Java 并发编程的艺术> 概述 相信大家都很熟悉如何使用 Java 编写处理并发的代码,也知道 Java 代码在编译后变成 Class 字节码,字节码被类加载器加载到 JV ...

  10. history-back

    ;!function(pkg, undefined){ //此声明函数在xback.js文件里有,在app.js里必须再声明一次,不然监听返回事件失败 var STATE = 'x-back'; va ...