Es中时间聚合date

Es中时间聚合date,第1张

Es中时间聚合date 问题描述:

想要统计一天中每个小时数据
在没有数据且前面的时间里没有数据的统计数据拿不到,
比如Es中存在6点到20点的数据,直接使用Es中date_histogram指定calendar_interval为1h,得到的数据只有6点到20点的。
如下图Es的search:

POST /logs/_search
{   
    "size": 0, 
    "aggs" : {
        "sales_over_time" : {
            "date_histogram" : {
                "field" : "time",
                "calendar_interval" : "1h",
                "min_doc_count": 0,
  			  }
            }
        }
    }
}

es返回,只能拿到开始有数据的时间,到最后有数据的时间
而不是我想想要的每个小时都有数据

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 5,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "sales_over_time" : {
      "buckets" : [
        {
          "key_as_string" : "2022-01-26T10:00:00.000Z",
          "key" : 1643191200000,
          "doc_count" : 3
        },
        {
          "key_as_string" : "2022-01-26T11:00:00.000Z",
          "key" : 1643194800000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T12:00:00.000Z",
          "key" : 1643198400000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T13:00:00.000Z",
          "key" : 1643202000000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T14:00:00.000Z",
          "key" : 1643205600000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T15:00:00.000Z",
          "key" : 1643209200000,
          "doc_count" : 2
        }
      ]
    }
  }
}

解决方法:

在时间聚合中加入 ,
“extended_bounds”: {
“min”: “time1”,
“max”: “time2”
}
其中的min/max可为时间字符串,
如 2022-01-26T00:00:00.000000 ,
也可以为时间戳,单位为毫秒,
如1643187600000,
即为2022-01-26 08:00:00
各编程语言的直接获取时间戳的精度不一样,
如Java中获取时间戳单位到毫秒,
python中获取时间戳只到秒,注意单位。
建议使用符合格式的时间字符串。
代码实例:

POST /logs/_search
{   
   //已经在限制了时间范围为2022年1月26日	
    ...
    "size": 0, 
    "aggs" : {
        "sales_over_time" : {
            "date_histogram" : {
                "field" : "time",
                "calendar_interval" : "1h",
                "min_doc_count": 0,
                 "extended_bounds": {
        "min": "2022-01-26T00:00:00.000000",
        "max": "2022-01-26T23:59:00.000000"
    }
            }
        }
    }
}

//得到的结果

{
   ...
  "aggregations" : {
    "sales_over_time" : {
      "buckets" : [
        {
          "key_as_string" : "2022-01-26T00:00:00.000Z",
          "key" : 1643155200000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T01:00:00.000Z",
          "key" : 1643158800000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T02:00:00.000Z",
          "key" : 1643162400000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T03:00:00.000Z",
          "key" : 1643166000000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T04:00:00.000Z",
          "key" : 1643169600000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T05:00:00.000Z",
          "key" : 1643173200000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T06:00:00.000Z",
          "key" : 1643176800000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T07:00:00.000Z",
          "key" : 1643180400000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T08:00:00.000Z",
          "key" : 1643184000000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T09:00:00.000Z",
          "key" : 1643187600000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T10:00:00.000Z",
          "key" : 1643191200000,
          "doc_count" : 3
        },
        {
          "key_as_string" : "2022-01-26T11:00:00.000Z",
          "key" : 1643194800000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T12:00:00.000Z",
          "key" : 1643198400000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T13:00:00.000Z",
          "key" : 1643202000000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T14:00:00.000Z",
          "key" : 1643205600000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T15:00:00.000Z",
          "key" : 1643209200000,
          "doc_count" : 2
        },
        {
          "key_as_string" : "2022-01-26T16:00:00.000Z",
          "key" : 1643212800000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T17:00:00.000Z",
          "key" : 1643216400000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T18:00:00.000Z",
          "key" : 1643220000000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T19:00:00.000Z",
          "key" : 1643223600000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T20:00:00.000Z",
          "key" : 1643227200000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T21:00:00.000Z",
          "key" : 1643230800000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T22:00:00.000Z",
          "key" : 1643234400000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T23:00:00.000Z",
          "key" : 1643238000000,
          "doc_count" : 0
        }
      ]
    }
  }
}

PS
使用上述方案的时候,建议配合range限制时间范围,且和extended_bounds中的时间一致,
如果不一致的话,
例如range中限制时间范围为25日到26日两天的,extended_bounds中的时间仅仅写为26日的,
统计的数据则为25号第一条数据的那个小时到26号所有的小时数据。
如25号一条数据是8点30的,统计的数据则是从25号八点开始到26日结束的小时。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5716467.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-18
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存