1、倒排索引

ElasticSearch比传统的数据库查询更快,因为ElasticSearch是基于倒排索引,但是传统数据库是基于B树/B+树。
倒排索引:是指数据存储时,进行分词建立term索引库。倒排索引源于实际应用中需要根据属性的值来查找记录。这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址。由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引(inverted index)。
ElasticSearch建立的索引如下:

ID是Elasticsearch自建的文档id

es 排序报错 es 排序 性能_es 排序报错


Elasticsearch分别为每个field都建立了一个从该filed到ID的映射关系。无论是何种类型的倒排索引,里面的 ID 都是存储到一个 Posting List 的结构中,这个 Posting List 就被称为是倒排表。Posting list就是一个int的数组,存储了所有符合某个term的文档id。通过posting list这种索引方式可以很快进行查找,比如要找耳机的词条,就是3和4。

2、FST(Finite State Transducers)

FST(有穷状态转换器)

FST的设计让ElasticSearch用最小的内存存储Term Index

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

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

演示网址:http://examples.mikemccandless.com/fst.py?terms=&cmd=Build+it%21

es 排序报错 es 排序 性能_属性值_02


⭕ 表示一种状态 , -->表示状态的变化过程,上面的字母/数字表示状态变化和权重。将单词分成单个字母通过⭕ 和–>表示出来,0权重不显示。如果⭕ 后面出现分支,就标记权重,最后整条路径上的权重加起来就是这个单词对应的序号。当遍历上面的每一条边的时候,都会加上这条边的输出,比如当输入是 stop 的时候会经过 s/3和 o/1 ,相加得到的排序的顺序是 4 ;而对于 mop ,得到的排序的结果是 0 。

term index不需要存下所有的term,它包含的是term的一些前缀,仅仅是他们的一些前缀与Term Dictionary之间的映射关系,可以使term index缓存到内存中。从term index查到对应的term dictionary位置之后,再去磁盘上找term,大大减少了磁盘随机读的次数。

3、倒排表的压缩算法

FOR(Frame Of Reference):

Elasticsearch要求posting list是有序的,除了第一个id以外,后面的id都存储为前一个id的增量

es 排序报错 es 排序 性能_es 排序报错_03


RBM(Roaring Bitmaps):

es 排序报错 es 排序 性能_属性值_04