ES倒排索引原理

倒排索引是一种数据结构,其中包含单词词典,倒排列表,倒排文件

单词词典

保存索引数据时,对文档进行分词拆分,写入词典。
单词词典是倒排索引中非常重要的组成部分,它用来维护文档集合中出现过的所有单词的相关信息,同时用来记载某个单词对应的倒排列表在倒排文件中的位置信息。在支持搜索时,根据用户的查询词,去单词词典中查询,能够获得相应的倒排列表,并以此作为后续排序的基础。
对于一个规模很大的文档集合来说,可能包含几十万甚至上百万的不同单词,能够快速定位某个单词直接影响到搜索是的相应速度,所以需要搞笑的数据结构来对单词词典进行构建和查找,常用的数据结构包含哈希加链表结构和树形词典结构。

哈希加链表

key代表每一个不同的词语,value代表的是一个集合(链表),里面保存了包含这个词语的文档的编号。

Finite State Transducers(有限状态机转换)

倒排列表

包含某个单词的文档集合,该单词有一个指针指向它。它包含文档ID,词频,文档频率

例:[73,300,302,332,343,372]

Frame Of Refrence

解决:如何压缩以节省磁盘空间;

压缩,就是尽可能的降低每个数据占用的空间,同时又不能让数据失真,能够还原回来。
1、增量编码
[73,300,302,332,343,372] ---> [73,227,2,30,11,29]
2、分割成块
[73,227,2,30,11,29] ---> [73,227,2],[30,11,29]
3、按需分配空间
[73,227,2],最大元素227,需要8bit,这个块每个元素分配8bit的空间;
[30,11,29] ,最大元素30,只需要5bit,那这个块每个元素分配5bit的空间。

Roaring bitmaps

解决:如何快速求交并集
以下三个数组如何求交集?
[64, 300, 303, 343]
[73, 300, 302, 303, 343, 372]
[303, 311, 333, 343]
Integer数组:首先,如果使用数组进行遍历的话,假设有100万文档id,这些数据放到内存中处理肯定是不现实的。
Bitmap:使用0,1数组,用0表示该数据不存在,1表示存在。占用空间小,且0,1天然支持位运算求交集。
Roaring Bitmaps:Bitmap可能存在空间浪费,因为无论一个segment中存储多少文档id,bitmap使用的空间都是一样的。因此如果文档数量不多时反而使用数组更加节省内存。如果文档数量少于4096时,使用Integer数组,否则使用bitmap

倒排文件

倒排列表的集合

倒排索引更新策略

1、完全重建策略:新文档并不立即被解析和加入索引中,而是先进行“文档暂存”。待文档暂存区中的文档达到一定数量后,将这些新文档和旧文档混在一起,对所有文档重新建立索引,替换旧索引。代价较高
2、再合并策略:新文档会被立即解析,但解析结果不会立刻加入到旧索引中,而是进行“索引暂存”。索引暂存其实就是建立索引的过程,待索引暂存区达到一定数量后,暂存区中的索引和旧索引进行合并。
3、原地更新策略:新文档被立刻解析,解析结果立刻被加入旧索引中。这种方式有较好的实时性,在理论上是种比较优秀的策略。为了加快索引速度,索引内部一般都会有一个”调优“的机制,例如,移动某些文件在磁盘中的位置,使索引过程中刺头移动距离尽可能小,磁盘等待时间尽量少。如果新文档立刻进入旧索引,那么索引内部就会不断执行”调优“过程,反而使性能下降。
4、混合策略:其思想是混合地使用上述几种策略,取长补短,以达到最好的性能。

ES为什么快?

ES通常指Elasticsearch,它之所以快速主要有几个原因:

  1. 分布式架构: Elasticsearch采用分布式架构,数据被分成多个分片并存储在多个节点上,这样可以提高查询和写入操作的并行性,从而提升整体性能。

  2. 倒排索引: Elasticsearch使用倒排索引来加速搜索。倒排索引是一种数据结构,它通过记录每个词项(单词或词组)出现在哪些文档中,来加快文本搜索速度。这种方式能够迅速定位到包含搜索词的文档,而不需要逐个遍历所有文档。

  3. 近实时(Near Real-Time)搜索: Elasticsearch提供了近乎实时的搜索能力,它允许数据在被索引后几乎立即就能被搜索到。这种特性对于需要快速反馈和及时更新的应用非常有用。

  4. 灵活的分片和副本策略: Elasticsearch允许对数据进行分片和副本设置,这样可以根据需求灵活地调整数据的分布和冗余,从而提高系统的吞吐量和容错能力。

总的来说,Elasticsearch综合利用了分布式计算、优化的索引结构和近实时搜索等技术,使得其具备了快速高效地处理大量数据和复杂查询的能力。

除此之外,ES提供了丰富的聚合查询功能