sql - 在elasticsearch中获取最近一小时的记录

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

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

最佳答案

首先,了解您是否使用 Kibana 来可视化数据会很有用吗?

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

Elastic 假定您以 UTC 格式存储日期(除非您另有说明)。假设现在是您所在时区的 16:30,并且您在日期字段中索引了包含 16:30 的文档。 Elastic 认为这是 16:30 UTC,而实际上它只是 UTC 的 11:00(假设您提前 5:30) - Elastic 中的“现在”日期始终是 UTC。

所以,你有两个选择 -

  1. 对数据建立索引,以便传递带有日期的时区
  2. 将查询更改为"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/

相关文章:

sql - 为什么 "ANY"不能正常工作?

sql - 多个表的多个外键

node.js - 可以在生产中使用 `require(' babel/register);`

elasticsearch - Elastica - 如何添加过滤器 - 对象术语

mysql - 从 3-4 个表中选择的 SQL 查询

mysql - SQL:选择 5 个 url,尽可能快地访问最少的域

linux - 是否可以在没有 GUI 的情况下从控制台运行 node-webkit

node.js - NodeJS、N-API、nan、node-gyp 和 cmake-js 之间的区别

elasticsearch - 在logstash文件中输出的max_value大小是多少?

elasticsearch - 在一个字段中对多个关键字进行建模