# 基于 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
基于以上示例来分析:纯用倒排索引来实现的弊端
对于 query 来说,搜索使用倒排索引速度很快
结果出来之后,对于 aggs 来说,如果也使用倒排索引的话就会出现性能低下的问题, 以 1000 条数据来说,如果聚合字段是分词的,那么你至少要遍历整个倒排索引数据才能拿到整个 field 的全部值, 如果是以正派索引来获取,那么最多遍历 1000 次就能拿到整个 doc 的信息,而往往可能在前面几条就拿到了
所以 es 是使用 倒排索引+正排索引(doc value) 方式来进行聚合分析操作的