博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
elasticsearch的倒排索引及算法简介
阅读量:4037 次
发布时间:2019-05-24

本文共 1094 字,大约阅读时间需要 3 分钟。

目录:

1、什么是倒排索引

2、posting list的两种压缩算法:

      FOR(Frame of Reference)算法

      RBM(Roaring Bitmaps)算法

              RBM的三种存储:ArraysContainer/BitmapContainer/RunContainer

 

 

正文:

一、什么是倒排索引?

倒排索引包含三个内容:

      1、倒排表(posting list)             存储搜索数据的id列表

      2、词项字典(term dictionary)   存储数据仓库中的词汇

      3、词项索引(term index)          标识当前词项是不是被搜索

看图:

 

二、posting list的存储算法

1)FOR压缩算法

    利用斐波那契数列(前两项的和等于第三项)算法,将原始数据压缩为有顺序的一个或多个斐波那契数列。这一个或多个菲波那切数列数列就称之为delta list。

如图:

 

 

这种算法比较适合原始数据都比较小的数字,对于有大的数字来讲,压缩效果不是太好。

 

2)RBM压缩算法

    这种算法会把一个数转换为32位的二进制数之后,然后拆分为高16位和低16位存储。也就是将原数除以65536(即2^16),商是高位,余数是低位。然后高位相同的,会将余数存储到同一个队列中。

示例图:

 

RBM算法有点类似hashmap里面链表hash算法。

对于余数的队列存储又分为不同的数据结构容器(Container)。

Container有三种:

a) ArrayContainer

因为余数一定是在1~65536之间的,所以这种方式就是给每个数字划定固定的16bit的磁盘空间。因此这种存储会随着文件的增多,呈线性增长。当有4096个数的时候,这个存储空间就达到了65536bit,即8KB。

示例图:

b) BitmapContainer

这个存储会利用一串二进制数来标识多个数字,二进制数为1的索引位置就是所表示的数字。用65536个二进制数字就可以表示0~65536之间所有的数。也就是对于这种存储来讲,是固定的65536bit空间,即8KB.

示例图:

 

对于ArrayContainer和BitmapContainer,有一个图来表示数据量文件数多少与空间占用关系:

从关系中可以看出,如果一组文件数少于4096,使用ArrayContainer更省空间。如果文件数大于4096,使用BitmapContainer更省空间。

c)RunContainer

   这种存储只适合处理连续的数字。对于连续的数字,只存储开头和结尾的数字即可,空间大小就是用2个int型数字来存储,共需要8Byte。 现实中这种情况比较少见。

 

 

 

 

 

转载地址:http://zhcdi.baihongyu.com/

你可能感兴趣的文章
微服务架构的设计模式
查看>>
持续可用与CAP理论 – 一个系统开发者的观点
查看>>
nginx+tomcat+memcached (msm)实现 session同步复制
查看>>
c++字符数组和字符指针区别以及str***函数
查看>>
c++类的操作符重载注意事项
查看>>
c++模板与泛型编程
查看>>
STL::deque以及由其实现的queue和stack
查看>>
WAV文件解析
查看>>
DAC输出音乐2-解决pu pu 声
查看>>
WPF中PATH使用AI导出SVG的方法
查看>>
WPF UI&控件免费开源库
查看>>
QT打开项目提示no valid settings file could be found
查看>>
Win10+VS+ESP32环境搭建
查看>>
Ubuntu+win10远程桌面
查看>>
flutter-实现圆角带边框的view(android无效)
查看>>
android 代码实现圆角
查看>>
flutter-解析json
查看>>
android中shader的使用
查看>>
java LinkedList与ArrayList迭代器遍历和for遍历对比
查看>>
drat中构造方法
查看>>