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”
}
}
}
}

1年前 评论
讨论数量: 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

1年前 评论
EsQustion (楼主) 1年前
EsQustion (楼主) 1年前
EsQustion (楼主) 1年前
working (作者) 1年前
EsQustion (楼主) 1年前
working (作者) 1年前
EsQustion (楼主) 1年前

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

1年前 评论
EsQustion (楼主) 1年前

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

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

1年前 评论