ES在聚合、检索数据时,为了保证效率,在不对数量做主动设置时,只会用最小量的数。terms检索文档默认只会查询10条数据,想必大家都知道。其实,terms聚合时也是如此。
当我们给terms聚合字段没有设置size时,那ES“偷懒”就只会查询10条数据。
所以,你会发现,即使你查询了100条数据,聚合时,只出现了10条。并且会有sum_other_doc_count大于0。那到底改设置多少呢才合适呢?
Api中其实对数量也是有说明的,但是没有说这个数到底是什么。
org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder#size(int)
让我们一起探索一下吧:
下面举例:
当terms聚合字段的size值设置的比字段本身的类型少时,就会出现"sum_other_doc_count" 大于0。
这说明从分片是没有全部拿到我期望参与聚合的所有数据。
改进一下:
我们按照terms聚合字段的数据类型相同的数量,设置size值时,就会出现:"sum_other_doc_count" : 0,
这个时候所有期望参与聚合的数据,都参与了聚合。OK了。