ElasticSearch进阶 ——单field索引索引原理
目录
## 参考文献传送门:
索引原理: 我是传送门(
倒排索引: 我是传送门(
压缩技术:
缓存压缩:我是传送门(FTS
编码压缩:我是传送门(Frame Of Reference
## 与lucene区别:
1.分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索
2.实时分析的分布式搜索引擎
3.可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据
## 索引思路:
将磁盘里的东西尽量搬进内存,结合磁盘顺序读取特性减少磁盘随机读取次数,并使用多种压缩算法,最终再以极
其苛刻的态度使用内存
## 原理简述:
1. Elasticsearch分别为每个field都建立了一个倒排索引(Term-Posting List),结构类似于key-value形式,组成的
索引表中每一项都包括一个属性值和具有该属性值的各记录地址,由属性值确定目标记录位置
[注意]:
1.此处value(Posting List)存储结构为数组结构,即可能存在多条记录属性的属性值相同情况
2.结合压缩技术(Frame Of Reference)将Posting List压缩处理,按字节存储,提高空间利用率
2. ES将所有索引排序组成索引表(Term Dictionary),再使用二分法进行查找(logN)
3. 考虑到如果倒排索引表中记录过多情况,内存中可能不易存储大量数据,故为其建立索引页(Term Index,树形结
构),其中存储索引部分前缀与其对应表中位置的映射关系
[注意]:
1.因为索引页的存在,使得索引时可以快速定位到索引表,从而进一步确定索引所在位置
2.由于存储的是索引的部分前缀,因此无需再全部存储大量的索引字段数据
3.即便存在索引前缀重复问题也只需向后执行顺序查找即可,仍然能够大幅度提升查找的效率
4.结合压缩技术(FST)保证索引表缓存进入内存中,而具体的大量的索引则存储于磁盘上
整体流程:
通过内存中索引页索引前缀确定索引表中位置,执行顺序遍历精确到该索引,最
终根据索引表定位目标记录位置进行获取
[注意]:
1.尽量保证索引字段有意义,由于默认自动建索引的,不需要索引的字段,一定要明确定义出来
2.尽量保证分词字段有意义,由于默认也是会分词的,对于String类型的字段,不需要分词的也需要明确定义出来
3.尽量保证ID的选择有规律,使用随机性太大的ID(UUID)将不利于查询
## 其他操作(CUD):性能较为低下
由于向Elasticsearch里插入一条记录时,其实就是直接存入一个json格式对象,这个对象有多个fields,并携带相应的
值,那么在插入这些数据的同时,ES还将为这些字段一一建立倒排序索引,因此使得增删改等操作效率低下,这同时
也彰显了作为一个优秀的搜索引擎,ES提倡一切的设计都是为搜索功能提供辅助优化这一理念