天天看点

Elasticsearch的索引机制

作者:程序员小橙

我们在平常的学习中,常常接触是MySQL数据库的索引,今天介绍的Elasticsearch,它与MySQL的差别是非常大的。并且在很多方面远远强于MySQL。而且在这么久的发展历程中,Elasticsearch对索引进行很大的改进。真正做到了效率与节省空间一把抓。

介绍:

ES是开源的,所以它的可扩展性好,并且可以选择HTTP网络的接口交互。

在处理文本时,它首先建立一个索引,这样耗时短,搜索的效率会很高。ES不同于MySQL的是:它直接在内存中寻找文本位置。ES还可以完成一些比较难的操作,像复杂的组合查询,而这是MySQL不能具备的。

索引:

ES和MySQL的概念:

Elasticsearch的索引机制

ES的倒排索引机制,是它一个很特殊的机制,这使得它可以根据搜索词快速反馈给你对应的文本。

Inverted Index

举个例子:

  1. Winter is comng
  2. Ous is fury
  3. This choice is your
Elasticsearch的索引机制

Finite State Transducers

它的功能类似一个Trie前缀树,根据前缀,我们就可以找到对应在文本中的位置。

根据下面已经排序好的一些词和他们的编号,生成的状态转换图:

Elasticsearch的索引机制

Posting Lists

当我们需要存储数据时,ES会将数据存入不同的segment,它是一个很小的分片单位,segment会定期合并这些数据。

posting list,是全部term文档的id的集合。ES会对这些文档进行一个处理,使他们转化成各个整型的id,并且不重复。

Roaring Bitmaps

Roaring bitmaps 在传统 bitmaps 上, 使用压缩解决数组稀疏问题.具体上讲, Roaring bitmaps 将1个 32 位整数集合, 按照高 16 位分桶(container),最多可分 个桶. 存储整数时,按照整数的高16位找到container(找不到就会新建一个),再将整数的低16位放入 container 中. 常见的 container 有一下2类:

  1. ArrayContainer

    当桶内数据的个数不大于4096时,会采用它来存储,其本质上是一个unsigned short类型(正好 16 位)的有序数组:Array[Short]。数组初始长度为4,随着数据的增多会自动扩容(但数组的最大长度就是4096, 即 ArrayContainer 最大占用从初始的 4 * 2B=8B, 到最大 4096 * 2B = 8KB)。另外还维护有一个计数器,用来实时记录基数。

  2. BitmapContainer

    当桶内数据的个数大于4096时,会采用它来存储,其本质上是长度固定为 位(8KB)的传统 bitmap (存储 个整数) 1物理表现为 长度固定为 1024 的 unsigned long型(64位,8B)数组:Array[Long] (size=1024),亦即这些位图的大小固定 8KB。它同样有一个计数器。

Elasticsearch的索引机制

总结

ES的效率很高,功能好用,节省时间。

倒排索引可以很精准高效的根据关键词反馈给你结果。

如果索引数量多,为了效率高,ES需要建立词典索引,构建有限状态转换器。

ES使用了索引帧技术压缩posting list,可以节省大量的系统空间。

继续阅读