GVKun编程网logo

按星期几和小时数的Elasticsearch聚合(按星期统计数据)

8

在这篇文章中,我们将带领您了解按星期几和小时数的Elasticsearch聚合的全貌,包括按星期统计数据的相关情况。同时,我们还将为您介绍有关ElasticSearch5.x实践_day04_01_E

在这篇文章中,我们将带领您了解按星期几和小时数的Elasticsearch聚合的全貌,包括按星期统计数据的相关情况。同时,我们还将为您介绍有关ElasticSearch5.x实践_day04_01_ElasticSearch聚合查询、Elasticsearch聚合 之 Date Histogram聚合、Elasticsearch聚合 之 DateRange日期范围聚合、Elasticsearch聚合 之 Ip Range IP地址范围聚合的知识,以帮助您更好地理解这个主题。

本文目录一览:

按星期几和小时数的Elasticsearch聚合(按星期统计数据)

按星期几和小时数的Elasticsearch聚合(按星期统计数据)

我有以下类型的文件:

[{"msg":"hello", date: "some-date"},{"msg":"hi!", date: "some-date"}, ...

我想按星期几计算文件数。例如,x消息在星期一发送,y消息在星期二发送,依此类推。

我已经使用date_histogram进行汇总,但是它会按日向我返回文档。它确实返回了当天,但是说“ 22周三”和“ 29周三”作为单独的汇总文档返回。

这在某种程度上与Elasticsearch有关-按星期和小时的天分组,但是该问题没有答案,因此我将其重新发布。根据那里的建议,它要求我对key_as_string进行术语聚合,但是我需要为每个对象添加doc_count而不是仅对术语进行计数。我也不知道如何在嵌套聚合中使用key_as_string。

这是我尝试过的:

"aggs" : {                "posts_over_days" : {                    "date_histogram" : {                         "field" : "created_time",                         "interval": "day",                        "format": "E"                     }                }

答案1

小编典典

在该线程中已经解决了同类问题。

为使解决方案适应您的问题,我们需要编写一个脚本以将日期转换为一天中的小时和一周中的某天:

Date date = new Date(doc[''created_time''].value) ; java.text.SimpleDateFormat format = new java.text.SimpleDateFormat(''EEE, HH'');format.format(date)

并在查询中使用它:

{    "aggs": {        "perWeekDay": {            "terms": {                "script": "Date date = new Date(doc[''created_time''].value) ;java.text.SimpleDateFormat format = new java.text.SimpleDateFormat(''EEE, HH'');format.format(date)"            }        }    }}

ElasticSearch5.x实践_day04_01_ElasticSearch聚合查询

ElasticSearch5.x实践_day04_01_ElasticSearch聚合查询

聚合提供了从你的数据中分组并萃取统计的能力。关于聚合的最简单的方法是将它大致等同于SQL组和SQL聚合函数。在Elasticsearch中,你可以执行搜索返回命中的结果,与此同时在同一个响应中返回聚合结果。在这个意义上这是非常强大和有效的,你可以使用简洁和简化的API在一次网络交互中完成查询和多个聚合操作。

首先,这个示例按state分组所有的account,然后返回按统计数(count)降序排列的前10个state。

POST /bank/_search
{
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "state.keyword"
      }
    }
  },
  "size": 0
}

在SQL中,上面的聚合在概念上类似:
SELECT state, COUNT(*) FROM bank GROUP BY state ORDER BY COUNT(*) DESC

{
  "_shards": {
    "failed": 0,
    "successful": 5,
    "total": 5
  },
  "aggregations": {
    "group_by_state": {
      "buckets": [
        {
          "doc_count": 27,
          "key": "ID"
        },
        {
          "doc_count": 27,
          "key": "TX"
        },
        {
          "doc_count": 25,
          "key": "AL"
        },
        {
          "doc_count": 25,
          "key": "MD"
        },
        {
          "doc_count": 23,
          "key": "TN"
        },
        {
          "doc_count": 21,
          "key": "MA"
        },
        {
          "doc_count": 21,
          "key": "NC"
        },
        {
          "doc_count": 21,
          "key": "ND"
        },
        {
          "doc_count": 20,
          "key": "ME"
        },
        {
          "doc_count": 20,
          "key": "MO"
        }
      ],
      "doc_count_error_upper_bound": 20,
      "sum_other_doc_count": 770
    }
  },
  "hits": {
    "hits": [],
    "max_score": 0.0,
    "total": 1000
  },
  "timed_out": false,
  "took": 29
}

我们可以看到在ID(Idaho)中有27个账户,紧跟着是27个账号在TX(Texas),然后是25个账号在AL(Alabama),以此类推。
需要注意的是我们设置了size=0用来不显示search hits(搜索结果中的hits),因为我们只想看返回的聚合结果。
在前边的聚合基础上,下面的例子计算各州(state)的平局账户余额。(仅取按计数降序排列的前十个)。

POST /bank/_search
{
  "aggs": {
    "group_by_state": {
      "aggs": {
        "average_balance": {
          "avg": {
            "field": "balance"
          }
        }
      },
      "terms": {
        "field": "state.keyword"
      }
    }
  },
  "size": 0
}

注意我们是如何将average_balance聚合嵌套在group_by_state聚合中的。这是所有聚合的通用模式。你可以在聚合中任意嵌套聚合用于萃取你所需的数据汇总。
基于前面的聚合,让我们根据余额平均数姜旭排列。

POST /bank/_search
{
  "aggs": {
    "group_by_state": {
      "aggs": {
        "average_balance": {
          "avg": {
            "field": "balance"
          }
        }
      },
      "terms": {
        "field": "state.keyword",
        "order": {
          "average_balance": "desc"
        }
      }
    }
  },
  "size": 0
}

这个例子演示了如何通过年龄组(年龄20-29岁,30-39岁,40-49),然后通过性别,最后得到每个年龄段、每个性别的平均账户余额。

POST /bank/_search
{
  "aggs": {
    "group_by_age": {
      "aggs": {
        "group_by_gender": {
          "aggs": {
            "average_balance": {
              "avg": {
                "field": "balance"
              }
            }
          },
          "terms": {
            "field": "gender.keyword"
          }
        }
      },
      "range": {
        "field": "age",
        "ranges": [
          {
            "from": 20,
            "to": 30
          },
          {
            "from": 30,
            "to": 40
          },
          {
            "from": 40,
            "to": 50
          }
        ]
      }
    }
  },
  "size": 0
}

 

 

 

 

 

 

 

 

 

 

 

Elasticsearch聚合 之 Date Histogram聚合

Elasticsearch聚合 之 Date Histogram聚合

Elasticsearch的聚合主要分成两大类:metric和bucket,2.0中新增了pipeline还没有研究。本篇还是来介绍Bucket聚合中的常用聚合——date histogram.参考:官方文档

用法

Date histogram的用法与histogram差不多,只不过区间上支持了日期的表达式。

{
"aggs":{
    "articles_over_time":{
        "date_histogram":{
            "field":"date",
            "interval":"month"
            }
        }
    }
}

interval字段支持多种关键字:`year`, `quarter`, `month`, `week`, `day`, `hour`, `minute`, `second`

当然也支持对这些关键字进行扩展使用,比如一个半小时可以定义成如下:

{
    "aggs":{
        "articles_over_time":{
            "date_histogram":{
                "field":"date",
                "interval":"1.5h"
                }
            }
        }
}

返回的结果可以通过设置format进行格式化:

{
    "aggs":{
        "articles_over_time":{
            "date_histogram":{
                "field":"date",
                "interval":"1M",
                "format":"yyyy-MM-dd"
                }
            }
        }
    }

得到的结果如下:

{
    "aggregations":{
        "articles_over_time":{
            "buckets":[{
                "key_as_string":"2013-02-02",
                "key":1328140800000,
                "doc_count":1
            },{
                "key_as_string":"2013-03-02",
                "key":1330646400000,
                "doc_count":2
            },
            ...
            ]}
        }
}

其中key_as_string是格式化后的日期,key显示了是日期时间戳,

time_zone时区的用法

在es中日期支持时区的表示方法,这样就相当于东八区的时间。

{
    "aggs":{
        "by_day":{
            "date_histogram":{
                "field":"date",
                "interval":"day",
                "time_zone":"+08:00"
            }
        }
    }
}

offset 使用偏移值,改变时间区间

默认情况是从凌晨0点到午夜24:00,如果想改变时间区间,可以通过下面的方式,设置偏移值:

{"aggs":{
    "by_day":{
        "date_histogram":{
            "field":"date",
            "interval":"day",
            "offset":"+6h"
            }
        }
    }
}

那么桶的区间就改变为:

"aggregations":{
    "by_day":{
        "buckets":[{
            "key_as_string":"2015-09-30T06:00:00.000Z",
            "key":1443592800000,
            "doc_count":1
        },{
            "key_as_string":"2015-10-01T06:00:00.000Z",
            "key":1443679200000,
            "doc_count":1
        }]
    }
}

Missing Value缺省字段

当遇到没有值的字段,就会按照缺省字段missing value来计算:

{
    "aggs":{
        "publish_date":{
            "date_histogram":{
                "field":"publish_date",
                "interval":"year",
                "missing":"2000-01-01"
            }
        }
    }
}

其他

对于其他的一些用法,这里就不过多赘述了,比如脚本、Order、min_doc_count过滤,extended_bounds等都是支持的。

Elasticsearch聚合 之 DateRange日期范围聚合

Elasticsearch聚合 之 DateRange日期范围聚合

相比于range聚合,date range就是范围可以由时间来指定。

例如:

{
    "aggs":{
        "range":{
            "date_range":{
                "field":"date",
                "format":"MM-yyy",
                "ranges":[
                    {"to":"now-10M/M"},
                    {"from":"now-10M/M"}
                ]
            }
        }
    }
}

其中to:now-10M/M表示,过去到10个月前

from:now-10M/M表示,从10个月前到现在

得到的结果就如下:

{
    ...
    "aggregations":{
        "range":{
            "buckets":[
                {
                    "to":1.3437792E+12,
                    "to_as_string":"08-2012",
                    "doc_count":7
                },{
                    "from":1.3437792E+12,
                    "from_as_string":"08-2012",
                    "doc_count":2
                }
            ]
        }
    }
}

它还支持很多其他的日期表达方式,可以参考joda日期表示。

Elasticsearch聚合 之 Ip Range IP地址范围聚合

Elasticsearch聚合 之 Ip Range IP地址范围聚合

相对于range和date range,这个聚合就是能够表示IP的范围。

普通IP模式

DSL命令:

{
    "aggs":{
        "ip_ranges":{
            "ip_range":{
                "field":"ip",
                "ranges":[
                    {"to":"10.0.0.5"},
                    {"from":"10.0.0.5"}
                ]
            }
        }
    }
}

返回结果:

{
...
"aggregations":{
    "ip_ranges":{
        "buckets":[
            {
                "to":167772165,
                "to_as_string":"10.0.0.5",
                "doc_count":4
            },{
                "from":167772165,
                "from_as_string":"10.0.0.5",
                "doc_count":6
            }
        ]
        }
    }
}

掩码模式

命令:

{
    "aggs":{
        "ip_ranges":{
            "ip_range":{
                "field":"ip",
                "ranges":[
                    {"mask":"10.0.0.0/25"},
                    {"mask":"10.0.0.127/25"}
                ]
            }
        }
    }
}

返回

{
    "aggregations":{
        "ip_ranges":{
            "buckets":[
                {
                    "key":"10.0.0.0/25",
                    "from":1.6777216E+8,
                    "from_as_string":"10.0.0.0",
                    "to":167772287,
                    "to_as_string":"10.0.0.127",
                    "doc_count":127
                },{
                    "key":"10.0.0.127/25",
                    "from":1.6777216E+8,
                    "from_as_string":"10.0.0.0",
                    "to":167772287,
                    "to_as_string":"10.0.0.127",
                    "doc_count":127
                }
            ]
        }
    }
}

 

今天关于按星期几和小时数的Elasticsearch聚合按星期统计数据的分享就到这里,希望大家有所收获,若想了解更多关于ElasticSearch5.x实践_day04_01_ElasticSearch聚合查询、Elasticsearch聚合 之 Date Histogram聚合、Elasticsearch聚合 之 DateRange日期范围聚合、Elasticsearch聚合 之 Ip Range IP地址范围聚合等相关知识,可以在本站进行查询。

本文标签: