ES支持靈活的聚合方式,它不僅支持聚合和查詢相結合,而且還可以使聚合的過濾條件不影響搜索條件,並且還支持在聚合后的結果中進行過濾篩選。
直接聚合
直接聚合指的是聚合時的DSL沒有query子句,是直接對索引內的所有文檔進行聚合。
GET /hotel/_search { "size": 0, "aggs": { "my_agg": { //聚合名稱 "avg": { "field": "price" //計算文檔的平均價格 } } } }
先查詢再聚合
與直接聚合相對應,這種查詢方式需要增加query子句,query子句和普通的query查詢沒有區別,參加聚合的文檔必須匹配query查詢。
{ // "size": 0, "query": { //指定查詢query邏輯 "term": { "city": { "value": "北京" } } }, "aggs": { //指定聚合邏輯 "my_agg": { "avg": { "field": "price" } } } }
前過濾器
有時需要對聚合條件進一步地過濾,但是又不能影響當前的查詢條件。
{ "size": 0, "query": { //指定查詢的query邏輯 "term": { "city": { "value": "青島" } } }, "aggs": { "my_agg": { "filter": { //指定過濾器邏輯 "term": { "full_room": true } }, "aggs": { //指定聚合邏輯 "my_avg": { "avg": { "field": "price" } } } } } }
后過濾器
該過濾器是在查詢和聚合之后進行過濾的,因此它的過濾條件對聚合沒有影響。
{ //"size": 0, "query": { //指定查詢的query邏輯 "match": { "title": "酒店" } }, "aggs": { //指定聚合邏輯 "my_agg": { "avg": { "field": "price", "missing": 200 } } }, "post_filter": { //指定后過濾器邏輯 "term": { "city": "北京" } } }