Elasticsearch 入门教程 – 实战分析_4

hitogram按价格区间统计电视销量和销售额

histogram:类似于terms,也是进行bucket分组操作,接收一个field,按照这个field的值的各个范围区间,进行bucket分组操作

"histogram":{ 

  "field": "price",

  "interval": 2000

},

interval:2000,划分范围,0~2000,2000~4000,4000~6000,6000~8000,8000~10000,buckets

去根据price的值,比如2500,看落在哪个区间内,比如2000~4000,此时就会将这条数据放入2000~4000对应的那个bucket中

bucket划分的方法,terms,将field值相同的数据划分到一个bucket中

bucket有了之后,一样的,去对每个bucket执行avg,count,sum,max,min,等各种metric操作,聚合分析

GET /tvs/sales/_search

{

   "size" : 0,

   "aggs":{

      "price":{

         "histogram":{ 

            "field": "price",

            "interval": 2000

         },

         "aggs":{

            "revenue": {

               "sum": { 

                 "field" : "price"

               }

             }

         }

      }

   }

}

{

  "took": 13,

  "timed_out": false,

  "_shards": {

    "total": 5,

    "successful": 5,

    "failed": 0

  },

  "hits": {

    "total": 8,

    "max_score": 0,

    "hits": []

  },

  "aggregations": {

    "group_by_price": {

      "buckets": [

        {

          "key": 0,

          "doc_count": 3,

          "sum_price": {

            "value": 3700

          }

        },

        {

          "key": 2000,

          "doc_count": 4,

          "sum_price": {

            "value": 9500

          }

        },

        {

          "key": 4000,

          "doc_count": 0,

          "sum_price": {

            "value": 0

          }

        },

        {

          "key": 6000,

          "doc_count: {

            "value":": 0,

          "sum_price" 0

          }

        },

        {

          "key": 8000,

          "doc_count": 1,

          "sum_price": {

            "value": 8000

          }

        }

      ]

    }

  }

}

date hitogram之统计每月电视销量

bucket,分组操作,histogram,按照某个值指定的interval,划分一个一个的bucket

date histogram,按照我们指定的某个date类型的日期field,以及日期interval,按照一定的日期间隔,去划分bucket

date interval = 1m,

2017-01-01~2017-01-31,就是一个bucket

2017-02-01~2017-02-28,就是一个bucket

然后会去扫描每个数据的date field,判断date落在哪个bucket中,就将其放入那个bucket

2017-01-05,就将其放入2017-01-01~2017-01-31,就是一个bucket

min_doc_count:即使某个日期interval,2017-01-01~2017-01-31中,一条数据都没有,那么这个区间也是要返回的,不然默认是会过滤掉这个区间的

extended_bounds,min,max:划分bucket的时候,会限定在这个起始日期,和截止日期内

GET /tvs/sales/_search

{

   "size" : 0,

   "aggs": {

      "sales": {

         "date_histogram": {

            "field": "sold_date",

            "interval": "month", 

            "format": "yyyy-MM-dd",

            "min_doc_count" : 0, 

            "extended_bounds" : { 

                "min" : "2016-01-01",

                "max" : "2017-12-31"

            }

         }

      }

   }

}

{

  "took": 16,

  "timed_out": false,

  "_shards": {

    "total": 5,

    "successful": 5,

    "failed": 0

  },

  "hits": {

    "total": 8,

    "max_score": 0,

    "hits": []

  },

  "aggregations": {

    "group_by_sold_date": {

      "buckets": [

        {

          "key_as_string": "2016-01-01",

          "key": 1451606400000,

          "doc_count": 0

        },

        {

          "key_as_string": "2016-02-01",

          "key": 1454284800000,

          "doc_count": 0

        },

        {

          "key_as_string": "2016-03-01",

          "key": 1456790400000,

          "doc_count": 0

        },

        {

          "key_as_string": "2016-04-01",

          "key": 1459468800000,

          "doc_count": 0

        },

        {

          "key_as_string": "2016-05-01",

          "key": 1462060800000,

          "doc_count": 1

        },

        {

          "key_as_string": "2016-06-01",

          "key": 1464739200000,

          "doc_count": 0

        },

        {

          "key_as_string": "2016-07-01",

          "key": 1467331200000,

          "doc_count": 1

        },

        {

          "key_as_strin

          "key_as_string": "2016-09-01",

          "key": 1472688000000,

          "doc_count": 0

        },g": "2016-08-01",

          "key": 1470009600000,

          "doc_count": 1

        },

        {

        {

          "key_as_string": "2016-10-01",

          "key": 1475280000000,

          "doc_count": 1

        },

        {

          "key_as_string": "2016-11-01",

          "key": 1477958400000,

          "doc_count": 2

        },

        {

          "key_as_string": "2016-12-01",

          "key": 1480550400000,

          "doc_count": 0

        },

        {

          "key_as_string": "2017-01-01",

          "key": 1483228800000,

          "doc_count": 1

        },

        {

          "key_as_string": "2017-02-01",

          "key": 1485907200000,

          "doc_count": 1

        }

      ]

    }

  }

}


统计每季度每个品牌的销售额

GET /tvs/sales/_search 

{

  "size": 0,

  "aggs": {

    "group_by_sold_date": {

      "date_histogram": {

        "field": "sold_date",

        "interval": "quarter",

        "format": "yyyy-MM-dd",

        "min_doc_count": 0,

        "extended_bounds": {

          "min": "2016-01-01",

          "max": "2017-12-31"

        }

      },

      "aggs": {

        "group_by_brand": {

          "terms": {

            "field": "brand"

          },

          "aggs": {

            "sum_price": {

              "sum": {

                "field": "price"

              }

            }

          }

        },

        "total_sum_price": {

          "sum": {

            "field": "price"

          }

        }

      }

    }

  }

}