【ElasticSearch】聚合查询优化实践
一、ES聚合功能源码解析
1. ES底层存储结构
ES底层采用Lucene做存储,ES中的一个索引由多个segment组成,每个segment会建立自己的倒排索引用于数据查询。在Lucene 4.0 之后,通过构建FST前缀索引加速检索,如下图所示。
- 字典索引为何不用HashMap来实现:HashMap消耗内存比FST要大很多,时间换空间,可把所有词项索引都放在内存
- 在TermDictIndex中查找到对应TermDict的block位置后,再去磁盘上找Term,可以大大节约时间。其中,TermDictIndex常驻内存,而词项字典和文档列表存储在FileSystem中
首先可以通过减少倒排索引的体积以及对倒排索引进行压缩,有效减少segment Memory。
2. ES聚合查询过程
ES实际执行文档收集、合并与排序的源码全部集中在QueryPhase中,方法为
org.elasticsearch.search.query.QueryPhase#execute(org.elasticsearch.search.internal.SearchContext)
//创建聚合需要的AggregationContext,
//里面包含了各个Aggregat