ES 聚合毫秒时间戳字段的时区问题

大家好,遇到一个问题,网上搜了大量资料无解,问了 AI 也得不到满意的解决方案,因为我使用 es时间不长,所以想来请教大家
需求是:根据一张索引表的一个 long 型的毫秒时间戳 字段进行聚合操作 统计count,已知要使用 dateHistogram来进行聚合操作

问题:因为 ES 的时区默认是 UTC 晚 8 小时 ,导致我统计的数据不准确,比如 4 月 15 号 凌晨 2 点添加的数据 会统计到 4 月 14 号 ,那么怎么对这个时间戳字段设置时区呢?

说明:本地测试设置时区会报错,不支持对毫秒 long 型的数据设置时区,使用 format 格式化也无法格式化,AI 说要使用 script 脚本,尝试了还是报错

目前想到一种解决方法是 put 数据的时候 加 8 个小时。。。。。转成毫秒时间戳 再存进去。。。

有没有老哥能给个思路啥的。。。或者说ES对long 型的数据就是没办法。。

最佳答案

兄弟们通过脚本解决了,解决方案就是给这个时间戳加 8 小时。。一开始 kimi 给的那个脚本有问题 ,导致我执行出错,修改了下 ok 了

GET /your_index/_search
{
“script_fields”: {
“formatted_date”: {
“script”: {
“source”: “doc[‘startTime’].value + 28800000”
}
}
}
}

11个月前 评论
讨论数量: 11

导入或者同步数据时要对时间数据处理 下面是php导入格式化时间的示例

 'created_at' => $order->created_at ? Carbon::parse($order->created_at, 'UTC')->tz('Asia/Shanghai')->toIso8601String() : null,

'updated_at' => $order->updated_at ? Carbon::parse($order->updated_at, 'UTC')->tz('Asia/Shanghai')->toIso8601String() : null,

'deleted_at' => $order->deleted_at ? Carbon::parse($order->deleted_at, 'UTC')->tz('Asia/Shanghai')->toIso8601String() : null,

原理基本上就是先把数据库时间转UTC再设置时区转8601

11个月前 评论
EsQustion (楼主) 11个月前
EsQustion (楼主) 11个月前
EsQustion (楼主) 11个月前
working (作者) 11个月前
EsQustion (楼主) 11个月前
working (作者) 11个月前
EsQustion (楼主) 11个月前

你看下这个offset能不能行 5.2.5. 日期直方图聚合

11个月前 评论
EsQustion (楼主) 11个月前

兄弟们通过脚本解决了,解决方案就是给这个时间戳加 8 小时。。一开始 kimi 给的那个脚本有问题 ,导致我执行出错,修改了下 ok 了

GET /your_index/_search
{
“script_fields”: {
“formatted_date”: {
“script”: {
“source”: “doc[‘startTime’].value + 28800000”
}
}
}
}

11个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!