基于查询结果的聚合和基于聚合结果的查询
一、基于查询结果的聚合
1、基于query的aggs
1 #价格大于4500的标签进行聚合 2 GET product/_search 3 { 4 "size": 10, 5 "query": { 6 "range": { 7 "price": { 8 "gte": 4500 9 } 10 } 11 }, 12 "aggs": { 13 "tags_bucket": { 14 "terms": { 15 "field": "tags.keyword" 16 } 17 } 18 } 19 }
2、基于filter的aggs
1 GET product/_search 2 { 3 "query": { 4 "constant_score": { 5 "filter": { 6 "range": { 7 "price": { 8 "gte": 4500 9 } 10 } 11 } 12 } 13 }, 14 "aggs": { 15 "tags_bucket": { 16 "terms": { 17 "field": "tags.keyword" 18 } 19 } 20 } 21 }
3、基于bool查询的aggs
1 GET product/_search 2 { 3 "query": { 4 "bool": { 5 "filter": { 6 "range": { 7 "price": { 8 "gte": 4500 9 } 10 } 11 } 12 } 13 }, 14 "aggs": { 15 "tags_bucket": { 16 "terms": { 17 "field": "tags.keyword" 18 } 19 } 20 } 21 }
二、基于聚合的查询
1 #先进行聚合,再使用post_filter进行查询 2 GET product/_search 3 { 4 "aggs": { 5 "tags_bucket": { 6 "terms": { 7 "field": "tags.keyword" 8 } 9 } 10 }, 11 "post_filter": { 12 "term": { 13 "tags.keyword": "性价比" 14 } 15 } 16 }
三、聚合排序
聚合排序:再聚合后使用order进行排序。
_count:按照数量进行排序
_key:按照字典序进行排序,abcd.......
1 #单级聚合 2 GET product/_search 3 { 4 "size": 0, 5 "aggs": { 6 "tags_agg": { 7 "terms": { 8 "field": "tags.keyword", 9 "size": 10, 10 "order": { 11 "_count": "asc" 12 } 13 } 14 } 15 } 16 }
1 #多级聚合 2 GET product/_search 3 { 4 "size": 0, 5 "aggs": { 6 "first_order": { 7 "terms": { 8 "field": "tags.keyword", 9 "order": { 10 "_count": "asc" 11 } 12 }, 13 "aggs": { 14 "second_order": { 15 "terms": { 16 "field": "lv.keyword", 17 "order": { 18 "_count": "desc" 19 } 20 } 21 } 22 } 23 } 24 } 25 }
1 #多层聚合 2 GET product/_search 3 { 4 "aggs": { 5 "type_avg_price": { 6 "terms": { 7 "field": "type.keyword", 8 "order": { 9 "agg_stats>stats.min": "asc" 10 } 11 }, 12 "aggs": { 13 "agg_stats": { 14 "filter": { 15 "terms": { 16 "type.keyword": [ 17 "耳机", 18 "手机" 19 ] 20 } 21 }, 22 "aggs": { 23 "stats": { 24 "stats": { 25 "field": "price" 26 } 27 } 28 } 29 } 30 } 31 } 32 } 33 }