elasticsearch聚合之bucket terms聚合( 二 )


3.3.2 运行结果

elasticsearch聚合之bucket terms聚合

文章插图
3.4 子聚合排序-先根据省聚合,然后根据每个聚合后的最小年龄排序3.4.1 dslGET /index_person/_search{"size": 0,"aggs": {"agg_sex": {"terms": {"field": "province","order": {"min_age": "asc"}},"aggs": {"min_age": {"min": {"field": "age"}}}}}}GET /index_person/_search{"size": 0,"aggs": {"agg_sex": {"terms": {"field": "province","order": {"min_age.min": "asc"}},"aggs": {"min_age": {"stats": {"field": "age"}}}}}}注意:子聚合排序一般也是不准的,但是如果是根据子聚合的最大值倒序最小值升序又是准的 。
3.4.2 运行结果
elasticsearch聚合之bucket terms聚合

文章插图
3.5 脚本聚合-根据省聚合,如果地址中有黄冈市则需要出现黄冈市3.5.1 dslGET /index_person/_search{"size": 0,"runtime_mappings": {"province_sex": {"type": "keyword","script": """String province = doc['province'].value;String address = doc['address.keyword'].value;if(address.contains('黄冈市')){emit('黄冈市');}else{emit(province);}"""}},"aggs": {"agg_sex": {"terms": {"field": "province_sex"}}}}
elasticsearch聚合之bucket terms聚合

文章插图
3.5.2 运行结果
elasticsearch聚合之bucket terms聚合

文章插图
3.6 filter-以省分组,并且只包含北的省,但是需要排除湖北省3.6.1 dslGET /index_person/_search{"size": 0,"aggs": {"agg_province": {"terms": {"field": "province","include": ".*北.*","exclude": ["湖北"]}}}}注意:当是字符串时,可以写正则表达式,当是数组时,需要写具体的值 。
3.6.2 运行结果
elasticsearch聚合之bucket terms聚合

文章插图
3.7 多term聚合-根据省和性别聚合,然后根据最大年龄倒序3.7.1 dslGET /index_person/_search{"size": 0,"aggs": {"genres_and_products": {"multi_terms": {"size": 10,"shard_size": 25,"order":{"max_age": "desc"},"terms": [{"field": "province","missing": "defaultProvince"},{"field": "sex"}]},"aggs": {"max_age": {"max": {"field": "age"}}}}}}注意: terms聚合默认不支持多字段聚合,需要借助别的方式 。此处使用multi terms来实现多字段聚合 。
3.7.2 运行结果
elasticsearch聚合之bucket terms聚合

文章插图
3.8 missing value 处理
elasticsearch聚合之bucket terms聚合

文章插图
3.9 多个聚合-同时返回根据省聚合和根据性别聚合3.9.1 dslGET /index_person/_search{"size": 0,"aggs": {"agg_province": {"terms": {"field": "province"}},"agg_sex":{"terms": {"field": "sex","size": 10}}}}3.9.2 运行结果
elasticsearch聚合之bucket terms聚合

文章插图
4. 总结4.1 可以聚合的字段一般情况下,只有如下几种字段类型可以进行聚合操作 keyword,numeric,ip,booleanbinary类型的字段 。text类型的字段默认情况下是不可以进行聚合的,如果需要聚合,需要开启fielddata
elasticsearch聚合之bucket terms聚合

文章插图
4.2 如果我们想返回所有的聚合Term结果如果我们只想返回1001000个唯一结果,可以增大size参数的值 。但是如果我们想返回所有的,那么推荐使用 composite aggregation
elasticsearch聚合之bucket terms聚合

文章插图
4.3 聚合数据不准我们通过terms聚合到的结果是一个大概的结果,不一定是完全正确的 。

经验总结扩展阅读