【ElasticSearch 进阶】倒排索引 + FOR + RBM压缩算法

news2024/11/28 0:58:02

1. 倒排索引

在这里插入图片描述
在这里插入图片描述
如果有100w的数据,进行分词后,每个id按数字类型进行存储,假设每个行数据都包含相同的词,则每个词的 Posting List 需要占用约4M的空间:

1 int = 4 Bytes
100W int = 400W Bytes ≈ 4M

极大的浪费了空间。则需要对Posting List 进行压缩,压缩算法有:FOR + RBM

2. FOR压缩算法

FOR算法的核心思想是用减法来削减数值大小,从而达到降低空间存储。
假设V(n)表示数组中第n个字段的值,那么经过FOR算法压缩的数值V(n)=V(n)-V(n-1)。也就是说存储的是后一位减去前一位的差值。存储是也不再按照int来计算了,而是看这个数组的最大值需要占用多少bit来计算,如例所示:
在这里插入图片描述

例一:
  1. 比如Posting List是1-100W的有序数组,原本需要4Byte * 100W =3200W bit
  2. 压缩后的Delta List全是1的数组,100W bit,直接压缩了32倍
例二
  1. 比如数组是73,300,302,332,342,372,原本需要4 * 6 byte = 24byte = 192bit
  2. 压缩后:73,227,2,30,11,29,其中227最大,需要 8bit 的容器来存放,共计需要 8 * 6 = 48 bit,还需要记录容器的记录,需要1Byte,则 48 + 8 = 56bit
  3. 继续观察这个数组,发现最大值227和最小值2,相差较大,因为2只需要1bit来存放,比较浪费,所以还可以对数据进行分组:[73, 227] [2, 30, 11, 29 ]
  4. 分组后占用空间就变成了 [73, 227] 还是需要 8bit 的空间,但 [2, 30, 11, 29 ]最大值是30 < 2^5,只需要 5bit 的空间,因此总空间 8bit * 2 + 5bit * 4 + 2 * 8bit =52 bit

可以看到大小又变小了,但是思考一个问题:是不是还可以进行压缩?是越小越好吗?
是可以再压缩,但是我们还要考虑解码的问题,数据压缩后是要使用的,因此需要解码,压缩得越深,解码越耗时,并且存放容器记录也需要占用空间,因此不是越小越好,那么在哪里取一个平衡,这就是通过计算机动态计算。

  • 数组元素值为与前一位的差值V(n)=V(n)-V(n-1),n=2,3,4…
  • 稠密数组
  • 计算数组中最大值所需占用的大小
  • 计算数组是否需要拆分,计算拆分后每组的最大值所需占用的大小并记录

3. RBM压缩算法

FOR算法的核心是用减法来缩减数值大小,但数值太过离散时,减法能够达到的效果是不明显的,比如100W,200W,300W,相减后是100W,100W,100W,依然很大,这时的压缩效果很不理想,所以引入了RBM算法。

更有效减小数值的大小的方法:除法

RBM的核心就是通过除法来缩减数值大小,但是并不是直接的相除。
比如数组为 [1000, 62101, 131385, 191173, 196658]
其中196658的二进制表示为0000 0000 0000 0011 0000 0000 0011 0010
然后将其高16位和低16位分别转换为10进制:
0000 0000 0000 0011 -> 3
0000 0000 0011 0010 -> 50
那么196658就转换成了(3,50)的表示形式,其效果就相当于除以2^16(因为int类型的最大值就是 2 ^32 = 2^16 * 2^16),商3余50
再因为商和余数都不超过16位,那么我们最大用16bit来存储足够了。也就是short类型,因此商和余数都可以用一个short来盛装。
在这里插入图片描述
将每一个商所对应的余数short[]称之为一个容器Container,使用上述所说的short盛装也称为ArrayContainer。

现在有10亿条11位的电话号码,请问如何用2G的空间将他们存储下来?
答:使用数组
存储电话号码phone: arr[(phone-10000000000)/64] | (1 << ((phone-10000000000)%64))
判断电话号码是否存在:arr[(phone-10000000000)/64] & (1 << ((phone-10000000000)%64)) > 0

以上的二维数组,每一个Container中的数据当量足够多时我们认为他是有序连续的,就可以选用bitmap来进行存储,按照规定一个Container的最大值是65534,也就需要65535bit=8k的容器来存储,当然bitmap有个很明显的缺点,那就是无论Container中有多少个数,都要占用8k的大小,所以当数量不超过65535bit /16bit = 4096个时,使用short (16bit)来存储更划算,当每个Container的数量超过4096个时使用bitmap更加划算,那么使用bitmap的Container称为BitmapContainer
在这里插入图片描述
还有一个Container叫RunContainer,专门用来解决连续数组存储的,比如[1,2,3,100W],那么可以表示为[1,100W],只存储一个最小值和最大值,如果数组是如下形式
[1,2,3,4,5,100,101,102,999,1000,1001]
就会被拆分为三段:[1,5],[100,102],[999,1001]

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IDC:中国网络安全市场投资规模将在2026年达到319亿美元

近日&#xff0c;IDC咨询发布《IDC Market Forecast&#xff1a;中国网络安全市场预测&#xff0c;2022-2026》报告&#xff0c;对未来五年的中国网络安全市场发展走向做出分析预测。报告认为&#xff0c;中国IT安全市场投资规模逐年攀升&#xff0c;到2026年将达到319亿美元&a…

MySQL经典50题

MySQL经典50题 mysq经典50题拿来练手 文章目录MySQL经典50题创建表及信息录入1、查询"01"课程比"02"课程成绩高的学生的信息及课程分数2、查询"01"课程比"02"课程成绩低的学生的信息及课程分数3、查询平均成绩大于等于60分的同学的学生…

[阶段4 企业开发进阶] 5. Netty

文章目录1 Netty1.1 Netty介绍1.2 Netty应用场景2 Java BIO编程2.1 IO模型2.2 BIO、NIO、AIO 适用场景分析2.3 BIO3 Java NIO编程3.1 NIO基本介绍3.2 NIO和BIO的比较3.3 NIO三大核心原理1 Netty 1.1 Netty介绍 Netty 是由 JBOSS 提供的一个 Java 开源框架Netty 是一个异步的、…

技术分享 | 做为测试,那些必须掌握的测试技术体系

软件测试技术是软件开发过程中的一个重要组成部分&#xff0c;是贯穿整个软件开发生命周期、对软件产品&#xff08;包括阶段性产品&#xff09;进行验证和确认的活动过程。其目的是尽快尽早地发现在软件产品中所存在的各种问题&#xff0c;与用户需求、预先定义的不一致性。检…

Revit 中柱子附着屋顶小技巧和“柱断墙梁”方法

一、Revit 中柱子附着屋顶小技巧 Revit 中如何正确的使柱子附着于屋顶? 有的朋友绘制完结构柱后想要附着到屋顶上&#xff0c;这时候大家会选择把柱子顶部拉上去或者选择“附着顶部/底部”命令。但是这样会出现如图 1所示情况 此时柱子并未与屋顶完全相交&#xff0c;这时候有…

seata分布式事务AT模式原理解析

文章目录TC相关的表解析AT 模式如何做到对业务的无侵入写隔离读隔离AT模式特点TC相关的表解析 global_table&#xff1a;全局事务表&#xff0c;每当有一个全局事务发起后&#xff0c;就会在该表中记录全局事务的ID。branch_table&#xff1a;分支事务表&#xff0c;记录每一个…

一个简单实用的 JavaScript 日历控件源代码,不依赖第三方库,支持日期、月份、年份视图切换;支持单选、多选、范围和星期选

一个简单实用的 JavaScript 日历控件&#xff01;原生 JavaScript 编写&#xff0c;不依赖任何第三方库。支持日期、月份和年份试图切换&#xff1b;支持单选、多选、范围和星期选择模式&#xff1b;界面简介、配置简单、使用方便&#xff01; 完整代码下载地址&#xff1a;一个…

java计算机毕业设计ssm招聘信息管理平台9kvyw(附源码、数据库)

java计算机毕业设计ssm招聘信息管理平台9kvyw&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff0…

终于有P8大佬把困扰我多年的《计算机网络原理》全部讲明白了

前言 为什么网络协议这么重要呢&#xff1f;集群规模一大&#xff0c;我们首先想到的就是网络互通的问题&#xff1b;应用吞吐量压不上去&#xff0c;我们首先想到的也是网络互通的问题。所以&#xff0c;要成为技术牛人&#xff0c;搞定大系统&#xff0c;一定要过网络这一关&…

投影仪可以当电视看吗?告诉你好用的电视应用市场,建议收藏

当初在买投影仪和买电视中纠结了很久&#xff0c;最终选择了投影仪&#xff0c;现在又想看电视了……但是又不想再买个电视&#xff0c;那么问题来了&#xff0c;投影仪可以当电视用吗&#xff1f;经过本人一番研究&#xff0c;终于找到投影仪看电视的最简单方法&#xff1a;安…

Go C 编程 第3课 魔法自动机

慧通教育 慧通教育 30.画奔驰车标志(魔法学院第3课) 难度&#xff1a;1 登录 31.画拱型(魔法学院第3课) 难度&#xff1a;1 登录 32.画正三角形(魔法学院第3课) 难度&#xff1a;1 登录 33.画棱形(魔法学院第3课) 难度&#xff1a;1 登录 魔法学院的奇幻之旅&#xff1a;…

「安全狗漏洞通告」Fortinet SSL VPN远程代码执行漏洞解决方案

安全狗应急响应中心监测到&#xff0c;Fortinet发布了FortiOS SSL-VPN的风险通告&#xff0c;漏洞等级&#xff1a;高危&#xff0c;漏洞评分&#xff1a;9.3。漏洞编号&#xff1a;CVE-2022-42475。 安全狗应急响应中心建议广大用户做好资产自查以及预防工作&#xff0c;以免遭…

理解DDR Part 1

DDR x4 x8 x16 x4 x8 x16 指的上图黑色的chip输出的位宽&#xff0c;正常的DDR bus width 需要64bit&#xff0c;所以 chip width x4 x8 x16 黑色chip数量 16 8 4 上图是最常见的x8&#xff0c;也就有8个黑色的chip颗粒。x16的性能和x8的性能相比怎么样呢? 更差&…

html悬浮事件(表格th)

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>菜鸟教程(runoob.com)</title> </head> <body> <h4>一行三列:</h4> <table border"1"> <tbody class"fileLi…

UE5笔记【十三】蓝图系统-血量控制系统

上一篇我们讲解了&#xff0c;蓝图中的函数功能。可以将蓝图中重复的代码&#xff0c;再次利用。演示了Smasher的效果。 这一篇中&#xff0c;我们讲解Smasher造成伤害之后&#xff0c;如何保存和计算角色的血量状态。 我们的设计思路是&#xff1a;smasher每次碰到角色是&am…

GCSE英语语言考试-角色定位

What is characterisation? 什么是角色定位&#xff1f; Characterisation is the way writers create characters and make them believable. When writing about texts, it is easy to treat characters as real people. Try to remember that the author is creating chara…

大数据 finalshell免密登录

私有云 查看私有云创建的虚拟机 本机用FinalShell连接三个虚拟机 使用浮动IP地址创建连接 设置主机名 maser虚拟机 slave1虚拟机 slave2虚拟机 IP地址与主机名映射 master虚拟机 slave1虚拟机 slave2虚拟机 ##关闭防火墙 关闭防火墙&#xff1a;systemctl stop f…

LeaRun.net代码生成器 一键生成前后端代码

自动代码生成是指根据自然语言的功能描述来生成代码。在项目开发过程中&#xff0c;有很多业务模块的代码是具有一定规律性的&#xff0c;例如controller控制器、service接口、service实现类、mapper接口、model实体类等等&#xff0c;这部分代码可以使用代码生成器生成&#x…

一种通过刷写替换boot的方法

写在前面的废话 众所周知,ECU软件包括BOOT和APP两部分,一般来说,boot是固化的软件,改动可能性很小,一般用来更新APP,但是,如果有一天boot真的需要更新呢,而且是大批量的更新,真的需要一个个的开盖烧录吗,有没有一种便捷的方式去实现boot的替换呢?下面提供一种boot替…

手把手教你使用SpringBoot做一个员工管理系统【配置篇】

手把手教你使用SpringBoot做一个员工管理系统【配置篇】1.导入资源2.编写pojo层3.编写dao层4.首页实现5.页面国际化1.导入资源 导入前端文件&#xff1a; 管理系统前端源码下载地址 将下载的前端文件导入到SpringBoot资源目录&#xff1a; 导入Maven依赖&#xff1a;&#x…