在elasticsearch中获取最后一小时的记录

时间:2017-10-13 11:49:23

标签: sql node.js elasticsearch kibana

我的日期列上有以下映射:

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

我仍然得到相同的结果。请帮忙

1 个答案:

答案 0 :(得分:1)

首先,知道您是否使用Kibana来显示数据是有用的吗?

行为有点奇怪,但可以解释。

弹性假设您以UTC格式存储日期(除非您另有说明)。假设您的时区现在是16:30,并且您在日期字段中使用16:30索引文档。 Elastic认为这是UTC时间16:30,而UTC实际上只有11:00(假设您提前5:30) - Elastic中的'now'日期始终为UTC。

所以,你有两个选择 -

  1. 为数据编制索引,以便使用日期
  2. 传递时区
  3. 将您的查询更改为"lte": "now+5h+30m"
  4. 在范围查询中指定time_zone时,根据文档,它对now不执行任何操作。

    请参阅“范围查询中的时区” - https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-range-query.html