# 基于 doc value 正排索引的聚合内部原理

本章节会开始接待这些疑问:

  • 聚合分析的内部原理是什么?
  • 执行一个聚合操作的时候,内部原理是怎样的呢?
  • 用了什么样的数据结构去执行聚合?
  • 是不是用的倒排索引?

搜索+聚合,写个示例

GET /test_index/test_type/_search
{
	"query": {
		"match": {
			"search_field": "test"
		}
	},
	"aggs": {
		"group_by_agg_field": {
			"terms": {
				"field": "agg_field"
			}
		}
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

基于以上示例来分析:纯用倒排索引来实现的弊端

对于 query 来说,搜索使用倒排索引速度很快

结果出来之后,对于 aggs 来说,如果也使用倒排索引的话就会出现性能低下的问题, 以 1000 条数据来说,如果聚合字段是分词的,那么你至少要遍历整个倒排索引数据才能拿到整个 field 的全部值, 如果是以正派索引来获取,那么最多遍历 1000 次就能拿到整个 doc 的信息,而往往可能在前面几条就拿到了

所以 es 是使用 倒排索引+正排索引(doc value) 方式来进行聚合分析操作的