ES 索引
- Elasticsearch(以下称之为 ES)是一款基于 Lucene 的分布式全文搜索引擎,擅长海量数据存储、数据分析以及全文检索查询。
- Lucene 是 Apache 下的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,它是 ES 实现全文检索的核心基础,索引文档以及搜索索引的的核心流程都是在 Lucene 中完成的。
基础结构
MySQL | ES |
database数据库 | index索引库 |
table表 | type类型 |
row行,记录 | document文档 |
column列 | filed字段 |
索引
- 索引类似于Mysql数据库中的库概念,在ES之前的版本是有type这个概念的,后来的版本去掉了type,所以索引又有表的概念。简单的说,索引就是文档的容器,是一类文档的集合,逻辑空间上的分类,物理空间上的分片
倒排索引
- ES中使用的是倒排索引,Mysql中的是正排索引,通过key去查value,而倒排索引是通过value去查key
- Mysql中的一张表
ID | Name | Age | Sex |
1 | hjx | 24 | 男 |
2 | Bob | 24 | 女 |
3 | Alan | 26 | 女 |
- 如果在ES中存储上表中的数据,ES会创建以下的索引
Term | Posting List |
hjx | 1 |
Bob | 2 |
Alan | 3 |
24 | [1,2] |
26 | 3 |
男 | 1 |
女 | [2,3] |
Term是字段值,Posting List是其所属的id数组
Term Dictionary
- 你会发现,本来Mysql中我存储三行数据就可以了,而在ES中却存储了七行数据,哪里高效了?ES为了查询Term快速,将所有Term排序,然后二分法查找Term,LogN的查找效率,类似查字典表,这个就是Term Dictionary。
Term Index
- 当数据量多的时候,Term Dictionary的量也很大,放在缓存中不现实,而Term Index就像是字典中的索引页一样,比如我找A开头的有哪些,分别在哪页等等,在Term Dictionary的基础上又加了一层索引,可以看成一棵树。
- 当然,Term Index不会保存所有的Term Dictionary,只是保存了Term的一些前缀与Term Dictionary之间的映射关系,再结合FST压缩技术,Term Index可以保存在内存中,这样从Term Index查询到Term Dictionary的block位置之后,再去磁盘中查找Term,就大大减少了访问磁盘的次数。
FST
- FST(Finite State Transducer):有限状态传感器
- 在这里使用moth、month、munt、mount、top、pop演示结果
- FST有两个优点:1)空间占用小。通过对词典中单词前缀和后缀的重复利用,压缩了存储空间;2)查询速度快。O(len(str))的查询时间复杂度。
- FST以字节的方式存储所有的term,这种压缩方式可以有效的缩减存储空间,使得term index足以放进内存,但这种方式也会导致查找时需要更多的CPU资源。
- Term Index放在内存中,Term Dictionary在磁盘中,所以使用ES查询时,先查询Term Index然后去磁盘中查找Term Dictionary所在的block块,获取其Posting List