当前位置: 首页 > news >正文

ES-深入理解倒排索引

倒排索引

idproductdesc
1新版 小米 至尊-纪念版手机
1小米 NFC 手机
3NFC手机
4小米 耳机
5华为 耳机
6扫地机器人
7华为 Mata
………………
term_indexterm dictionaryposting list
------------------------------------
小米1……100W
华为6,7,9
NFC76,90
耳机5352
红米643,98
机器人645,9806
………………

我们引入这两个表格来理解倒排索引,第一个表是真实的数据,我们根据product这个字段进行分词,然后拆分的词为term dictionary,然后将id,存在posting list。
在这里插入图片描述
对于倒排表有两种压缩算法进行存储
1 Frame OF Reference 索引帧(FOR)
在这里插入图片描述
真正的ES存储是类似于第二个例子,采用分组的形式。这大概就是FOR的压缩逻辑,但是缺陷就是如果数据特别离散压缩效果不会很好,采用RBM来进行存储。
2 Roaring BitMap 咆哮位图(RBM)
在这里插入图片描述
对于词项字典我们对应的也有方式来存储
1 先来了解一下前缀树
前缀树有一定的复用,每一个终端节点就是一个单词,我们发现如果不是终端节点比如我们查找AB在这里面是找不到的,同时最后DF也是没有复用的存储了多次,因此需要进一步优化。
在这里插入图片描述

2 基于前缀树的优化
2.1 有限状态机
有限个状态 同一时间只能处于同一个状态 不同状态之间可以相互转换 状态是无序的
就像下面这张图,我只话了部分边,就是哥哥状态可以相互转换。
在这里插入图片描述
2.2 有限状态接收机
在前缀树的基础上我们插入jksj jksjtech jkb estech
4 和 8 为终止节点 数据在边上 节点是数字 如果插入一个单词当前比如之前没有jkb当插入到b的时候发现没有这个字母,则会选择一个红色的节点作为结束,为什么不选4因为选四就会多一个单单词jksjb但实际我们没有不符合我们的期望。
在这里插入图片描述
这个里面是否存在ES呢?
其实是不存在的,我们没有插入ES,但是es恰好在终止节点,所以多存储了一些不存在的数据。所以这样优化还是不够需要进一步看下面的结构。
2.3 有限状态转换机(FST)
FST最重要的功能是可以实现Key到Value的映射,相当于HashMap。FST的查
询速度⽐HashMap要慢⼀点但FST的内存消耗要⽐HashMap少很多。FST在
Lucene中被⼤量使⽤,例如:倒排索引的存储,同义词词典的存储,搜索关键
字建议等
比如我们有下面这几个数据:
后面这个数字一般是由机器算出来的,这个值是来解决上面的问题,也就是来校准是否真的存在例如es这种例子。
jksj/10
jksjtech/5
jkb/2
在这里插入图片描述
当我们插入jksj的时候 j:10 后面的字母都为0就可以 也可以k:10其它数字都为0
但是我们插入jksjtech 这个时候j前面的权重和必须要小于等于5,不然jksjtech 不可能为5 所以这个时候可以j:5 然后把另外的5放到output也里面去,也就是在终止节点开外挂。当然前面值可以任意分配只要不超过5 比如j:3 k:2 s: 0 :j + 外挂值 如果为终止节点则会加外挂这样就满足了我们的需要。
jkb/2 后面插入jkb的时候同样的原理会从新分配路径上的值。

2.4 ES的存储逻辑
frontier[]
⽤来存放UnCompiledNode,即待处理的节点(未持久化的节点)
current[]
存放CompiledNode,即最终的节点,存储(持久化以后的节点)

在这里插入图片描述

ARC {label 值,output 节点字面信息, target(包含一个flag 下一个节点的头补信息 && 下一个节点的label) 指向的节点}。

在这里插入图片描述

abd
abe
abfi
abfj
abfk
abgl
abgm
abgn
abgo
abgp
abgq
abgr
abh
ac
这个是字典序排好以后进行插入,来理解FST的过程:
首先插入abd, 然后插入abe代表d结尾的Node结束了可以进行落盘,按照这个逻辑只要后面与这个节点无关了就可以进行落盘,然后如果达到了每个block的最大数量最后就会进行分裂,整个过程就是不停的落盘生成子文件,子文件进行分裂,形成了上面这张图的文件结构。其中有一些术语,pending block是等待落盘的,floor block是已经落盘的。pending trem是一个单独的也就是没有其它字符共享block。
term index的存储

图片来源:图片来源地址
在这里插入图片描述

参考资料 极客时间ES

http://www.lryc.cn/news/250274.html

相关文章:

  • linux NAT网卡配置static
  • 信奥编程 1168:大整数加法
  • k8s上Pod全自动调度、定向调度、亲和性调度、污点和容忍调度详解
  • C# 动态编译代码并执行
  • nginx配置反向代理及负载均衡
  • 【古月居《ros入门21讲》学习笔记】09_订阅者Subscriber的编程实现
  • Java全栈基础篇--集合
  • Facebook公共主页受限、被封?一文教你排雷解决
  • Day04:每日一题:2661. 找出叠涂元素
  • SpringBoot 整合Redis
  • tensorflow-gpu1.15 + win11 + RTX 4050环境配置
  • jmeter资料
  • 代码随想录算法训练营第三十六天| 435 无重叠区间 763 划分字母区间 56 合并区间
  • 2023-12-01 事业-代号s-引流技巧和营销思路
  • 反转链表的Java实现
  • 2022年1月14日 Go生态洞察:Go 1.18 新教程探索
  • 国内某知名半导体公司:实现虚拟化环境下的文件跨网安全交换
  • 14.Tomcat和HTTP协议-[一篇通]
  • 在线陪诊系统: 医疗科技的崭新前沿
  • MySQL的基础知识
  • 【EI会议征稿】第七届大数据与应用统计国际学术研讨会(ISBDAS 2024)
  • 最轻量级最完整的屏幕适配完全适配各个手机方案
  • IDEA安装python插件并配置
  • 简单的Python烟花代码,跨年了
  • 社区医院儿童疫苗接种管理系统设计与开发
  • Docker下安装Redis
  • 【python笔记】与网络编程相关的知识总结
  • 【libGDX】Mesh立方体贴图(6张图)
  • 数据爬取+数据可视化实战_哪里只得我共你(Dear Jane)_词云展示----网易云
  • spring事务管理快速入门(以转账为例)