elasticsearch的倒排索引及算法简介

目录:

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)          标识当前词项是不是被搜索

看图:

elasticsearch的倒排索引及算法简介_第1张图片

 

二、posting list的存储算法

1)FOR压缩算法

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

如图:

elasticsearch的倒排索引及算法简介_第2张图片

 

 

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

 

2)RBM压缩算法

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

示例图:

elasticsearch的倒排索引及算法简介_第3张图片

 

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

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

Container有三种:

a) ArrayContainer

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

示例图:

elasticsearch的倒排索引及算法简介_第4张图片

b) BitmapContainer

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

示例图:

elasticsearch的倒排索引及算法简介_第5张图片

 

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

elasticsearch的倒排索引及算法简介_第6张图片

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

c)RunContainer

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

 

 

 

 

 

你可能感兴趣的:(java,ES,elasticsearch,倒排索引)