es 聚合毫秒时间戳字段的时区问题 | elasticsearch | elasticsearch 技术论坛-江南app体育官方入口

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

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

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

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

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

最佳答案

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

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

8个月前
讨论数量: 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

8个月前
(楼主) 8个月前
(楼主) 8个月前
(楼主) 8个月前
working (作者) 8个月前
(楼主) 8个月前
working (作者) 8个月前
(楼主) 8个月前

你看下这个offset能不能行

8个月前
(楼主) 8个月前

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

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

8个月前

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