请选择 进入手机版 | 继续访问电脑版
搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

ElasticSearch基础6:Bucket桶聚合

[复制链接]
查看: 65|回复: 0

2万

主题

2万

帖子

7万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
71562
发表于 2020-1-14 18:13 | 显示全部楼层 |阅读模式
Bucket aggregations 桶聚合

Bucket聚合不像metrics聚合那样盘算字段上的怀抱,而是建立文档的Bucket。每个bucket都与一个标准(取决于聚合典范)相关联,该标正肯定当前高低文中的文档能否“落入”其中。换句话说,bucket有用地界说了文档集。除了bucket自己,bucket聚合还盘算并返回“落入”每个bucket的文档数。
与怀抱聚合不同,Bucket聚合可以保存子聚合。这些子聚合将针对由其“父”bucket聚合建立的bucket停止聚合。
有差此外bucket聚合器,每个都有差此外“bucketing”计谋。有的界说单个bucket,有的界说牢固数目的多个bucket,另有的在聚合进程中静态建立bucket。
时候相关聚合

Date histogram aggregation
这类多bucket聚合只能与日期或日期范围值一路操纵。由于在Elasticsearch中,日期在内部表现为long值,可以操纵日期/时候表达式指定间隔。基于时候的数据需要特别的支持,由于基于时候的间隔并不总是牢固的长度。
日历感知间隔可以大白天光节省会改变特定日期的长度,月份有差此外天数,闰秒可以牢固在特定年份上。
相比之下,牢固间隔总是国际单元的倍数,而且不会按照日历高低文而变动。calendar_interval典范以下:

  • minute
  • hour
  • day
  • week
  • month
  • quarter
  • year

数据:
  1. PUT my_index/_doc/1?refresh{  "date": "2015-10-01T00:30:00Z"}PUT my_index/_doc/2?refresh{  "date": "2015-10-01T01:30:00Z"}PUT my_index/_doc/2?refresh{  "date": "2015-10-02T11:05:00Z"}
复制代码
聚合:
  1. GET my_index/_search?size=0{  "aggs": {    "by_day": {      "date_histogram": {        "field":     "date",        "calendar_interval":  "day"      }    }  }}
复制代码
按天来聚合数目,结果:
  1. "aggregations" : {    "by_day" : {      "buckets" : [        {          "key_as_string" : "2015-10-01T00:00:00.000Z",          "key" : 1443657600000,          "doc_count" : 2        },        {          "key_as_string" : "2015-10-02T00:00:00.000Z",          "key" : 1443744000000,          "doc_count" : 1        }      ]    }  }
复制代码
10-1有2条,10-2有1条
time_zone时区位移1小时:
  1. GET my_index/_search?size=0{  "aggs": {    "by_day": {      "date_histogram": {        "field":     "date",        "calendar_interval":  "day",        "time_zone": "-01:00"      }    }  }}
复制代码
结果:
  1. "aggregations" : {    "by_day" : {      "buckets" : [        {          "key_as_string" : "2015-09-30T00:00:00.000-01:00",          "key" : 1443574800000,          "doc_count" : 1        },        {          "key_as_string" : "2015-10-01T00:00:00.000-01:00",          "key" : 1443661200000,          "doc_count" : 1        },        {          "key_as_string" : "2015-10-02T00:00:00.000-01:00",          "key" : 1443747600000,          "doc_count" : 1        }      ]    }  }
复制代码
由于ID为1的记录时候为 2015-10-01T00:30:00Z ,向前1小时,那就是往前一天了,所以9-30就有1笔记录了。
移位6小时:
  1. GET my_index/_search?size=0{  "aggs": {    "by_day": {      "date_histogram": {        "field":     "date",        "calendar_interval":  "day",        "offset":    "+6h"      }    }  }}
复制代码
结果:
  1. "aggregations" : {    "by_day" : {      "buckets" : [        {          "key_as_string" : "2015-09-30T06:00:00.000Z",          "key" : 1443592800000,          "doc_count" : 2        },        {          "key_as_string" : "2015-10-01T06:00:00.000Z",          "key" : 1443679200000,          "doc_count" : 0        },        {          "key_as_string" : "2015-10-02T06:00:00.000Z",          "key" : 1443765600000,          "doc_count" : 1        }      ]    }  }
复制代码

日期范围聚合 Date Range Aggregation
公用于日期值的范围聚合。此聚合与平常范围聚合的首要区分在于,from和to值可以用日期数学表达式表现,还可以指定返回from和to响应字段的日期格式。请留意,此聚合包含每个范围的from值,而不包含to值。
  1. POST /sales/_search?size=0{   "aggs": {       "range": {           "date_range": {               "field": "date",               "missing": "1976/11/30",               "ranges": [                  {                    "key": "Older",                    "to": "2016/02/01"                  },                   {                    "key": "Newer",                    "from": "2016/02/01",                    "to" : "now/d"                  }              ]          }      }   }}
复制代码
聚合早于2016/02/01(不含)的到"Older"
聚合从2016/02/01(包含)到现在(不含)的到"Newer"
更多用法见:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-daterange-aggregation.html
Filter Aggregation

望文生义,用于过滤后聚合,这将用于将当前聚合高低文缩小到一组特定的文档。
比如只聚合hat典范的均匀价格
  1. POST /sales/_search?size=0{    "aggs" : {        "t_shirts" : {            "filter" : { "term": { "type": "hat" } },            "aggs" : {                "avg_price" : { "avg" : { "field" : "price" } }            }        }    }}
复制代码
结果:
  1. "aggregations" : {    "t_shirts" : {      "doc_count" : 3,      "avg_price" : {        "value" : 92.5      }    }  }
复制代码
帽子的均匀价格92.5,数目有3个

Filters Aggregation


界说一个多bucket聚合,其中每个bucket与一个过滤器关联。每个bucket将收集与其关联挑选器婚配的全数文档。
  1. PUT /logs/_bulk?refresh{ "index" : { "_id" : 1 } }{ "body" : "warning: page could not be rendered" }{ "index" : { "_id" : 2 } }{ "body" : "warning:authentication error" }{ "index" : { "_id" : 3 } }{ "body" : "warning: connection timed out" }{ "index" : { "_id" : 4 } }{ "body" : "error: database disconnectioned " }
复制代码
聚合:
  1. GET /logs/_search{  "size": 0,  "aggs" : {    "messages" : {      "filters" : {        "filters" : {          "errors" :   { "match" : { "body" : "error"   }},          "warnings" : { "match" : { "body" : "warning" }}        }      }    }  }}
复制代码
结果:
  1. "aggregations" : {    "messages" : {      "buckets" : {        "errors" : {          "doc_count" : 2        },        "warnings" : {          "doc_count" : 2        }      }    }  }
复制代码
为啥errors有2个?warnings有2个(难道不是3个吗)?想一下为什么。
增加一笔记录
  1. PUT logs/_doc/5?refresh{"body": "info: user Bob logged out"}
复制代码
聚合,增加一个其他项"other_bucket_key"
  1. GET logs/_search{  "size": 0,  "aggs" : {    "messages" : {      "filters" : {        "other_bucket_key": "other_messages",        "filters" : {          "errors" :   { "match" : { "body" : "error"   }},          "warnings" : { "match" : { "body" : "warning" }}        }      }    }  }}
复制代码
结果:
  1. "aggregations" : {    "messages" : {      "buckets" : {        "errors" : {          "doc_count" : 2        },        "warnings" : {          "doc_count" : 2        },        "other_messages" : {          "doc_count" : 1        }      }    }  }
复制代码
Global Aggregation

界说搜索实行高低文中全数文档的单个存储桶。此高低文由您正在搜索的索引和文档典范界说,但不受搜索查询自己的影响。
也就是说要对索引全数聚合,也聚合单个搜索。
  1. POST /sales/_search?size=0{    "query" : {        "match" : { "type" : "hat" }    },    "aggs" : {        "all_products" : {            "global" : {},             "aggs" : {                 "avg_price" : { "avg" : { "field" : "price" } }            }        },        "hats": { "avg" : { "field" : "price" } }    }}
复制代码
可以看到,搜索命中3个,全数产物7个
  1. {  "took" : 1,  "timed_out" : false,  "_shards" : {    "total" : 1,    "successful" : 1,    "skipped" : 0,    "failed" : 0  },  "hits" : {    "total" : {      "value" : 3,      "relation" : "eq"    },    "max_score" : null,    "hits" : [ ]  },  "aggregations" : {    "all_products" : {      "doc_count" : 7,      "avg_price" : {        "value" : 92.25      }    },    "hats" : {      "value" : 92.5    }  }}
复制代码

间隔直方图聚合 Histogram Aggregation


从文档中提取的数值或数值范围值。它静态地在值上构建牢固巨细(也称为间隔)的存储桶。例如,假如文档有一个包含价格(数字)的字段,我们可以将此聚合设备为静态构建间隔为5的存储桶(假如价格为5美圆)。实行聚当令,将对每个文档的价格字段停止评价,并将其舍入到最接近的存储桶-例如,假如价格为32,存储桶巨细为5,则舍入将发生30,是以文档将“落入”与键30关联的存储桶中。为了使其更正式,下面是操纵的舍入函数:
  1. bucket_key = Math.floor((value - offset) / interval) * interval + offset
复制代码
以10元一个间隔停止个数统计
  1. POST /sales/_search?size=0{    "aggs" : {        "prices" : {            "histogram" : {                "field" : "price",                "interval" : 10            }        }    }}
复制代码
80元(到90元不含)的有2个,90元(到100元不含)的有1个,100元以上的有1个
  1. "aggregations" : {    "prices" : {      "buckets" : [        {          "key" : 80.0,          "doc_count" : 2        },        {          "key" : 90.0,          "doc_count" : 1        },        {          "key" : 100.0,          "doc_count" : 1        }      ]    }  }
复制代码
范围聚合 Range Aggregation

答利用户界说一组范围,每个范围代表一个bucket。在聚合进程中,将按照每个bucket范围和“bucket”相关/婚配文档检查从每个文档提取的值。
请留意,此聚合包含每个范围的from值,而不包含to值。
聚合:
  1. GET /sales/_search{    "aggs" : {        "price_ranges" : {            "range" : {                "field" : "price",                "ranges" : [                    { "to" : 80.0 },                    { "from" : 80.0, "to" : 90.0 },                    { "from" : 90.0 }                ]            }        }    }}
复制代码
小于80的0个,80-90(不含)2个,90(含)以上的2个
  1. "aggregations" : {    "price_ranges" : {      "buckets" : [        {          "key" : "*-80.0",          "to" : 80.0,          "doc_count" : 0        },        {          "key" : "80.0-90.0",          "from" : 80.0,          "to" : 90.0,          "doc_count" : 2        },        {          "key" : "90.0-*",          "from" : 90.0,          "doc_count" : 2        }      ]    }  }
复制代码
带key标签的写法:
  1. GET /_search{    "aggs" : {        "price_ranges" : {            "range" : {                "field" : "price",                "keyed" : true,                "ranges" : [                    { "key" : "cheap", "to" : 100 },                    { "key" : "average", "from" : 100, "to" : 200 },                    { "key" : "expensive", "from" : 200 }                ]            }        }    }}
复制代码
带状态的范围分组
  1. GET /_search{    "aggs" : {        "price_ranges" : {            "range" : {                "field" : "price",                "ranges" : [                    { "to" : 100 },                    { "from" : 100, "to" : 200 },                    { "from" : 200 }                ]            },            "aggs" : {                "price_stats" : {                    "stats" : { "field" : "price" }                }            }        }    }}
复制代码
状态结果:
  1. {  ...  "aggregations": {    "price_ranges": {      "buckets": [        {          "key": "*-100.0",          "to": 100.0,          "doc_count": 2,          "price_stats": {            "count": 2,            "min": 10.0,            "max": 50.0,            "avg": 30.0,            "sum": 60.0          }        },        {          "key": "100.0-200.0",          "from": 100.0,          "to": 200.0,          "doc_count": 2,          "price_stats": {            "count": 2,            "min": 150.0,            "max": 175.0,            "avg": 162.5,            "sum": 325.0          }        },        {          "key": "200.0-*",          "from": 200.0,          "doc_count": 3,          "price_stats": {            "count": 3,            "min": 200.0,            "max": 200.0,            "avg": 200.0,            "sum": 600.0          }        }      ]    }  }}
复制代码
内置排序

这些排序形式是桶 固有的 才能:它们操纵桶天生的数据 ,比如 doc_count 。 它们同享类似的语法,可是按照操纵桶的不同会有些渺小不同。
让我们做一个 terms 聚合可是按 doc_count 值的升序排序:
  1. GET /cars/_search{    "size" : 0,    "aggs" : {        "colors" : {            "terms" : {              "field" : "color",              "order": {                "_count" : "asc"               }            }        }    }}
复制代码
首先需要对text字段答应fielddata,运转聚合操纵会报错,官方的说法是text是会分词,假如text中一个文本为New York,那末就会被分红2个桶,一个New桶,一个York桶,那末明显不能聚合操纵,要末你把该典范更换成keyword典范,由于keyword典范是不会分词的,可以用来做聚合操纵。
  1. PUT /cars/_mapping{"properties": {"color": { "type": "text","fielddata": true}}}
复制代码
  1. POST /cars/_bulk{ "index": {}}{ "price" : 10000, "color" : "red", "make" : "honda", "sold" : "2014-10-28" }{ "index": {}}{ "price" : 20000, "color" : "red", "make" : "honda", "sold" : "2014-11-05" }{ "index": {}}{ "price" : 30000, "color" : "green", "make" : "ford", "sold" : "2014-05-18" }{ "index": {}}{ "price" : 15000, "color" : "blue", "make" : "toyota", "sold" : "2014-07-02" }{ "index": {}}{ "price" : 12000, "color" : "green", "make" : "toyota", "sold" : "2014-08-19" }{ "index": {}}{ "price" : 20000, "color" : "red", "make" : "honda", "sold" : "2014-11-05" }{ "index": {}}{ "price" : 80000, "color" : "red", "make" : "bmw", "sold" : "2014-01-01" }{ "index": {}}{ "price" : 25000, "color" : "blue", "make" : "ford", "sold" : "2014-02-12" }
复制代码
用关键字 _count ,我们可以按 doc_count 值的升序排序。
我们为聚合引入了一个 order 工具, 它答应我们可以按照以下几个值中的一个值停止排序:

  • _count

    •   按文档数排序。对 terms 、 histogram 、 date_histogram 有用。

  • _term

    •   按词项的字符串值的字母顺序排序。只在 terms 内操纵。

  • _key

    •   按每个桶的键值数值排序(理论上与 _term 类似)。 只在 histogram 和 date_histogram 内操纵。


按怀抱排序


偶然,我们会想基于怀抱盘算的结果值停止排序。 在我们的汽车销售分析仪表盘中,我们能够想依照汽车色彩建立一个销售条状图表,但依照汽车均匀售价的升序停止排序。
我们可以增加一个怀抱,再指定 order 参数援用这个怀抱即可:
  1. GET /cars/_search{    "size" : 0,    "aggs" : {        "colors" : {            "terms" : {              "field" : "color",              "order": {                "avg_price" : "asc"               }            },            "aggs": {                "avg_price": {                    "avg": {"field": "price"}                 }            }        }    }}
复制代码

  • 盘算每种色彩桶的均匀售价。
  • 桶依照盘算均匀值的升序排序。
结果:
  1. "aggregations" : {    "colors" : {      "doc_count_error_upper_bound" : 0,      "sum_other_doc_count" : 0,      "buckets" : [        {          "key" : "blue",          "doc_count" : 2,          "avg_price" : {            "value" : 20000.0          }        },        {          "key" : "green",          "doc_count" : 2,          "avg_price" : {            "value" : 21000.0          }        },        {          "key" : "red",          "doc_count" : 4,          "avg_price" : {            "value" : 32500.0          }        }      ]    }  }
复制代码
我们可以采纳这类方式用任何怀抱排序,只需简单的援用怀抱的名字。不外有些怀抱会输出多个值。 extended_stats 怀抱是一个很好的例子:它输出好几个怀抱值。
毗连矩阵 Adjacency Matrix Aggregation

返回毗连矩阵形式的桶聚集。该请求供给一个命名挑选器表达式的聚集,类似于挑选器聚合请求。响应中的每个bucket表现订交过滤器矩阵中的非空单元格。
给命名为A、B和C的挑选器,响应将返回具有以下称号的存储桶:
ABCA
A
A&B
A&C
B
B
B&C
C
  C
  1. PUT /emails/_bulk?refresh{ "index" : { "_id" : 1 } }{ "accounts" : ["hillary", "sidney"]}{ "index" : { "_id" : 2 } }{ "accounts" : ["hillary", "donald"]}{ "index" : { "_id" : 3 } }{ "accounts" : ["vladimir", "donald"]}{ "index" : { "_id" : 4 } }{ "accounts" : ["vladimir", "sidney"]}
复制代码
结果:
  1. "aggregations" : {    "interactions" : {      "buckets" : [        {          "key" : "grpA",          "doc_count" : 3        },        {          "key" : "grpA&grpB",          "doc_count" : 1        },        {          "key" : "grpA&grpC",          "doc_count" : 1        },        {          "key" : "grpB",          "doc_count" : 2        },        {          "key" : "grpB&grpC",          "doc_count" : 1        },        {          "key" : "grpC",          "doc_count" : 2        }      ]    }  }
复制代码


免责声明:假如加害了您的权益,请联系站长,我们会实时删除侵权内容,感谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2006-2014 淄博新闻网-淄博日报 淄博晚报 淄博财经新报 掌中淄博 淄博专业新闻资讯发布网站 版权所有 法律顾问:高律师 客服电话:0791-88289918
技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表