elasticsearch除了提供检索功能之外,还能做更多的事情,比如近实时的数据分析。对此elasticsearch提供了聚合aggregation模块,这比之前的facet模块更加强大。具体提供的聚合类型本文不再介绍,而是重点关注aggr模块中关于内存控制的一些事情。
1:Fielddata
aggr大量使用fielddata,fielddata也是es中的内存大户。众所周知,倒排索引建立了term到doc之间的映射,因此适合快速查询匹配term的doc。而aggr的应用场景恰恰是相反的,因此需要建立doc到term之间的映射关系,这就是fielddata。
(1) analyzed vs not_analyzed:
如果是分词字段,则该字段的值被拆解成为多个term,如果是针对term的聚合操作就会出现意向不到的结果,所以要根据应用场景来决定是对分词字段进行聚合还是对不分词字段进行聚合操作,当然这种错误是比较容易发现的,在multifield的前提下可以及时作出调整。
对于基数很高的string类型的分词字段,如果进行聚合操作,fielddata会非常大,加载到内存中会有隐患。分词进程通常会产生大量term,并且很多term都是唯一的,这就增加了这个field的总体基数&#