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,就大大减少了访问磁盘的次数。

es 更新文档字段为索引 es全文索引_elasticsearch

FST
  • FST(Finite State Transducer):有限状态传感器
  • 在这里使用moth、month、munt、mount、top、pop演示结果

es 更新文档字段为索引 es全文索引_倒排索引_02

  • FST有两个优点:1)空间占用小。通过对词典中单词前缀和后缀的重复利用,压缩了存储空间;2)查询速度快。O(len(str))的查询时间复杂度。
  • FST以字节的方式存储所有的term,这种压缩方式可以有效的缩减存储空间,使得term index足以放进内存,但这种方式也会导致查找时需要更多的CPU资源。
  • Term Index放在内存中,Term Dictionary在磁盘中,所以使用ES查询时,先查询Term Index然后去磁盘中查找Term Dictionary所在的block块,获取其Posting List