Elasticsearch 聚合操作


數據准備:

PUT /shop
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 2
  }
}

PUT /shop/_mapping/goods
{
  "properties": {
    "brand": {
      "type": "keyword"
    },
    "price": {
      "type": "float"
    },
    "model": {
      "type": "keyword"
    }
  }
}

POST /shop/goods/_bulk
{"index": {}}
{"price" : 2299.00, "model" : "小米8", "brand" : "小米"}
{"index": {}}
{"price" : 4499.00, "model" : "Mate 20", "brand" : "華為"}
{"index": {}}
{"price" : 3299.00, "model" : "小米Mix3", "brand" : "小米"}
{"index": {}}
{"price" : 1199.00, "model" : "榮耀9i", "brand" : "華為"}
{"index": {}}
{"price" : 2799.00, "model" : "R17", "brand" : "OPPO"}
{"index": {}}
{"price" : 729.00, "model" : "紅米6", "brand" : "小米"}
{"index": {}}
{"price" : 2799.00, "model" : "X23", "brand" : "VIVO"}
{"index": {}}
{"price" : 1799.00, "model" : "K1", "brand" : "OPPO"}

 

一、聚合為桶

按照手機的品牌brand划分為桶

查詢指令:

GET /shop/_search
{
  "size": 0, 
  "aggs": {
    "brand_aggs": {
      "terms": {
        "field": "brand"
      }
    }
  }
}

- size: 查詢條數,這里設置為0,因為我們不關心搜索到的數據,只關心聚合結果,提高效率
- aggs:聲明這是一個聚合查詢,是aggregations的縮寫
  - popular_colors:給這次聚合起一個名字,任意。
    - terms:划分桶的方式,這里是根據詞條划分
      - field:划分桶的字段

 

查詢結果:

{
  "took": 6,
  "timed_out": false,
  "_shards": {
    "total": 3,
    "successful": 3,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 8,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "brand_aggs": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "小米",
          "doc_count": 3
        },
        {
          "key": "OPPO",
          "doc_count": 2
        },
        {
          "key": "華為",
          "doc_count": 2
        },
        {
          "key": "VIVO",
          "doc_count": 1
        }
      ]
    }
  }
}

- hits:查詢結果為空,因為我們設置了size為0
- aggregations:聚合的結果
  - brand_aggs:我們定義的聚合名稱
    - buckets:查找到的桶,每個不同的brand字段值都會形成一個桶
      - key:這個桶對應的brand字段的值
      - doc_count:這個桶中的文檔數量

 

二、桶內度量

為聚合結果添加求價格平均值的度量

查詢指令:

GET /shop/_search
{
  "size": 0, 
  "aggs": {
    "brand_aggs": {
      "terms": {
        "field": "brand"
      },
      "aggs": {
        "price_aggs": {
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}

- aggs:我們在上一個aggs(brand_aggs)中添加新的aggs。可見度量也是一個聚合
  - price_aggs:聚合的名稱
    - avg:度量的類型,這里是求平均值
      - field:度量運算的字段

 

查詢結果:

{
  "took": 5,
  "timed_out": false,
  "_shards": {
    "total": 3,
    "successful": 3,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 8,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "brand_aggs": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "小米",
          "doc_count": 3,
          "price_aggs": {
            "value": 2109
          }
        },
        {
          "key": "OPPO",
          "doc_count": 2,
          "price_aggs": {
            "value": 2299
          }
        },
        {
          "key": "華為",
          "doc_count": 2,
          "price_aggs": {
            "value": 2849
          }
        },
        {
          "key": "VIVO",
          "doc_count": 1,
          "price_aggs": {
            "value": 2799
          }
        }
      ]
    }
  }
}

可以看到每個桶中都有自己的 price_aggs 字段,這是度量聚合的結果

 


免責聲明!

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



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