我的日期列上有以下映射:
"order_datetime": {
"type": "date",
"format" : "yyyy-M-d H:m:s"
}
我正在尝试在查询中使用以下范围过滤器获取最近一小时的记录:
{
"range": {
"order_datetime": {
"gte": "now-1h",
"lte": "now"
}
}
}
我收到的订单是在当前时间 5 到 6 小时之前订购的。谁能解释为什么会发生?我认为这是一个时区问题,因此附加了 time_zone
如下:
{
"range": {
"order_datetime": {
"gte": "now-1h",
"lte": "now",
"time_zone": "+05:30"
}
}
}
我仍然得到相同的结果。请帮忙
最佳答案
首先,了解您是否使用 Kibana 来可视化数据会很有用吗?
这种行为有点奇怪,但可以解释。
Elastic 假定您以 UTC 格式存储日期(除非您另有说明)。假设现在是您所在时区的 16:30,并且您在日期字段中索引了包含 16:30 的文档。 Elastic 认为这是 16:30 UTC,而实际上它只是 UTC 的 11:00(假设您提前 5:30) - Elastic 中的“现在”日期始终是 UTC。
所以,你有两个选择 -
- 对数据建立索引,以便传递带有日期的时区
- 将查询更改为
"lte": "now+5h+30m"
根据文档,在范围查询中指定 time_zone
时,它不会对 now
执行任何操作。
请参阅“范围查询中的时区”- https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-range-query.html
关于sql - 在elasticsearch中获取最近一小时的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46729266/