Elasticsearch倒排索引详解

news/2024/7/24 11:23:51 标签: elasticsearch, 大数据, 搜索引擎

倒排索引:

组成

term index(词项索引 ,存放前后缀指针)

Term Dictionary(词项字典,所有词项经过文档与处理后按照字典顺序组成的一个字典(相关度))

Posting List(倒排表,,包含Term的id数组(int类型有序数组,且不重复)、词频、postion、payload、offset等信息)包含两个压缩算法,FOR,RBM

一句话概括:倒排索引就是某个词项到包含当前这个词项id的映射关系

FOR

Frame Of Reference 又叫增量编码压缩,首先Elasticsearch要求倒排索引是有序的(也就是文档id是有序排列的),es会根据文档id两两计算差值,然后根据计算出来的值进行分块,每一块取最大值计算它是2的几次方,得出该块中每一个数字可以用多少个bit位来存储,另外还需要一个字节来表示每一个数据块是用多少bit位来存储一个数字的

FOR算法的核心是用减法来缩减数值大小

RBM

数组中每个数除以2^16,以商,余数的形式表示出来,将相同商的归在一个Container,如果Contaniner中数值容量超过4096使用bitmap的形式来存储一个Container中的数,如果没有超过那就使用short[]来存储,如果是连续数组那就使用RunContainer来存储,其中container分为 ArrayContainerBitmapContainerRunContainer三种

ArrayContainer ArrayContainer采用简单的short数组存储低16位数据,content始终有序且不重复,方便二分查,大数据量是4096,即8kb, 超过则使用BitmapContainer

BitmapContainer BitmapContainer采用long数组存储低16位数据,BitmapContainer构造方法会初始化一个长度为1024的long数组,因此BitmapContainer无论是存1个数据,10个数据还是最大65536个数据,都始终占据着8kb的内存空间

RunContainer RunContainer主要解决了大量连续数据的问题,原理就是记录初始数字以及连续的数量,但是这种压缩方式对于数据的疏密程度非常敏感,如果Container中所有数据都是连续的,这种压缩方式就会占据优势,如果Container中所有数据都是不连续的且都是偶数或奇数,这种不仅没有压缩反而会膨胀,因此是否选择使用RunContainer是需要判断的,RBM提供了一个转化方法为runOptimize()用于对比和其他两种Container的空间大小,若占据优势则会进行转化

RBM的核心就是通过除法来缩减数值大小

词项索引的检索原理:FST

词项索引数据结构为Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种(基于FST实现)。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较。Trie的核心思想是空间换时间,利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的

前缀树的3个基本性质

1、根节点不包含字符,除根节点外每一个节点都只包含一个字符 2、从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串 3、每个节点的所有子节点包含的字符都不相同

lucene从4开始大量使用的数据结构是FST(Finite State Transducer)。FST有两个优点:

  1. 空间占用小。通过对词典中单词前缀和后缀的重复利用,压缩了存储空间;

  2. 查询速度快。O(len(str))的查询时间复杂度

FST网页地址:http://examples.mikemccandless.com/fst.py?terms=cat%0D%0Acats%0D%0Acar%0D%0Adog%0D%0Adogs&cmd=Build+it%21

分词的发生时期

1.创建索引时对元数据进行分词

2.执行搜索时对 搜索词分词

正排索引

排索引是按照文档编号或文档ID等有序的方式将每个文档存储在索引中,通过文档编号或ID进行检索

doc values 是正排索引的基本数据结构之一,其存在是为了提升排序和聚合效率,默认true,如果确定不需要对字段进行排序或聚合,也不需要通过脚本访问字段值,则可以禁用doc values值以节省磁盘空间(不支持 text和annotated_text


http://www.niftyadmin.cn/n/5319658.html

相关文章

vue前端开发自学demo,父子组件之间传递数据demo2

vue前端开发自学demo,父子组件之间传递数据demo2!实际上,组件之间传递数据的,数据类型,是可以多种多样的,下面为大家展示几个常见的数据类型,比如数字类型,数组类型,对象类型。 代码如下所示&a…

Java面试题(java高级面试题)

线程池的核心线程数设置为多大比较合理? Worker线程在执行的过程中,有一部计算时间需要占用CPU,另一部分等待时间不需要占用CPU,通过量化分析,例如打日志进行统计,可以统计出整个Worker线程执行过程中这两…

HarmonyOS应用开发学习笔记 UIAbility组件与UI的数据同步 EventHub、globalThis

1、 HarmoryOS Ability页面的生命周期 2、 Component自定义组件 3、HarmonyOS 应用开发学习笔记 ets组件生命周期 4、HarmonyOS 应用开发学习笔记 ets组件样式定义 Styles装饰器:定义组件重用样式 Extend装饰器:定义扩展组件样式 5、HarmonyOS 应用开发…

报错java.lang.IllegalArgumentException: MALFORMED

java.lang.IllegalArgumentException: MALFORMEDat java.util.zip.ZipCoder.toString(ZipCoder.java:58)at java.util.zip.ZipInputStream.readLOC(ZipInputStream.java:300)at java.util.zip.ZipInputStream.getNextEntry(ZipInputStream.java:122)我是在解压压缩包文件的时候…

写在学习webkit过程的前面

webkit起源于KHTML,是KDE开源项目的KHTML和KJS引擎的一部分。在它的诞生和发展过程中,由两家著名的公司参与开发过程中,造成两次裂变。诞生两个内核webkit和blink,并发展和产生了两个主流的浏览器,分别为safari和chrom…

nginx 下载文件限速

前言 通过 ngx_http_core_module 的 limit_rate 和 limit_rate_after 实现官方文档:http://nginx.org/en/docs/http/ngx_http_core_module.html 限制下载速度 server {....#限制下载速度为200k每秒limit_rate 200k;.... }开始不限制下载速度,过一会儿…

蓝桥杯单片机组备赛——蜂鸣器和继电器的基本控制

文章目录 一、蜂鸣器和继电器电路介绍二、题目与答案2.1 题目2.2 答案2.3 重点函数解析 一、蜂鸣器和继电器电路介绍 可以发现两个电路一端都接着VCC,所以我们只要给另一端接上低电平就可以让蜂鸣器和继电器进行工作。与操作LED类似,只不过换了一个74HC5…

推荐熊猫电竞赏金电竞系统源码

熊猫电竞赏金电竞系统源码,包含APP、H5和搭建视频教程,支持运营级搭建,这套源码是基于ThinkPHPUniaapp框架开发的。 系统是一套完整的电竞平台开发源码,包括赛事管理、用户系统、竞猜系统、支付系统等模块。源码结构清晰&#xff…