ES中根据时间类型字段的按日期聚合方法

一、需求

ES中的记录只有具体时间的字段格式,需求是按日期以及其他字段嵌套聚合。

二、方法

1、ES自带的date_histogram

2、用script脚本。

三、具体解释

1、 使用date_histogram方式

(1)参数

"interval"的值赋为"day"

"format"的值赋为 "yyyy-MM-dd"

(2)结果

key_as_string:日期

key:key_as_string从1970年1月1日0时至今经历的毫秒数,所以这个值/1000/3600/24得到天数可以用在方式二。

2、 使用script

(1)代码

"script": {
	"source": '''
	Calendar c = Calendar.getInstance();
	c.set(1970, 1 - 1, 1, 0, 0, 0);##注意月份是1-1,Calendar类的month从0开始
	c.add(Calendar.DATE, (int)(doc['startTime'].value / 1000 / 3600 / 24));##加上经过的天数
	Date date = c.getTime();
	String format = new SimpleDateFormat('YYYY-MM-dd').format(date);
	return format + ',' + doc['content.RegistrationNo.keyword'].value + ',' + doc['content.RegistrationNoColor.keyword'].value + ',' + doc['eventTypeCode.keyword'].value '''
}

"aggs": {
            "result": {
                "terms": {
                "script": {
                    "source":'''
                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                        String sd = sdf.format(new Date(doc['content.FT_AlarmTime'].value));
                        return sd+','+doc['content.RegistrationNo.keyword'].value +','+ doc['content.RegistrationNoColor.keyword'].value'''
                },
                    "size":1000000
                }
            }
        }

(2)kibana结果

3、python中应用

def func(index):
    query_json={
        "size": 0,
         "aggs": {
          "result": {
            "terms": {
                "script": {
                    "source":'''
                        Calendar c = Calendar.getInstance();
                        c.set(1970,1-1,1,0,0,0);
                        c.add(Calendar.DATE,(int)(doc['startTime'].value/1000/3600/24));
                        Date date = c.getTime();
                        String format = new SimpleDateFormat('YYYY-MM-dd').format(date);
                        return format+','+doc['content.RegistrationNo.keyword'].value +','+ doc['content.RegistrationNoColor.keyword'].value +','+doc['eventTypeCode.keyword'].value'''
                },"size":1000000
            }
        }
        }
}
    query = ESconn.search(index=index, body=query_json, request_timeout=360)
    data=query['aggregations']['result']['buckets']
    return data

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值