我的日期列上有以下映射:
"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"
}
}
}
我仍然得到相同的结果。请帮忙
答案 0 :(得分:1)
首先,知道您是否使用Kibana来显示数据是有用的吗?
行为有点奇怪,但可以解释。
弹性假设您以UTC格式存储日期(除非您另有说明)。假设您的时区现在是16:30,并且您在日期字段中使用16:30索引文档。 Elastic认为这是UTC时间16:30,而UTC实际上只有11:00(假设您提前5:30) - Elastic中的'now'日期始终为UTC。
所以,你有两个选择 -
"lte": "now+5h+30m"
在范围查询中指定time_zone
时,根据文档,它对now
不执行任何操作。
请参阅“范围查询中的时区” - https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-range-query.html