ES聚合agg缺少结果

今天ES又踩了个坑,在使用ES的时候发现agg聚合缺少了一些结果。

有个接口是批量查询N个标签(tag)分别关联了多少商品,所以期望在agg中得到每个tag关联的商品数量,所以用到了terms agg。

线上接口发现某个标签关联的商品数量一会是0,一会不是0,变来变去的。

一开始怀疑是不是代码逻辑有问题,后来经过埋点排查,很快发现某次查询请求包含了标签A,但是terms agg的返回结果中却没有标签A,同时可以确定ES中的确有商品关联了标签A,这就很奇怪了。

经过积累日志,终于观察到问题的一个共性,这些agg聚合结果返回的bucket分桶都是10个,怎么会这样?原来terms agg默认只返回聚合后doc_count最多的10个bucket桶,而我期望的是返回我要统计的所有结果。

这个问题只需要给terms agg设置一个size参数即可,这个问题在stackoverflow有相关的说明:https://stackoverflow.com/questions/22927098/show-all-elasticsearch-aggregation-results-buckets-and-not-just-10。

官方文档对size参数的用法也有说明:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html。

希望可以帮助到大家。

如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~