es 聚合方式


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": "北京"
    }
  }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM