查询以提取超过30m年前更新的时间戳不起作用

我绞尽脑汁想解决这个问题。一切似乎都已签出,但无法正常工作:(

我有test-index以下文件的索引:

{

"_index": "test-index",

"_type": "testType",

"_id": "AV33b_VYUyX1XZAq7NTI",

"_score": 1,

"_source": {

"timestamp": "2017-08-17T17:56:55"

}

},

{

"_index": "test-index",

"_type": "testType",

"_id": "AV33cBN4UyX1XZAq7NTJ",

"_score": 1,

"_source": {

"timestamp": "2017-08-18T17:11:12"

}

},

{

"_index": "test-index",

"_type": "testType",

"_id": "AV33cetJUyX1XZAq7NTK",

"_score": 1,

"_source": {

"timestamp": "2017-08-19T17:11:12"

}

}

可以看到我有

  1. 理论上,该文件最近一次于昨天更新。
  2. 20分钟前(今天=撰写本文时,17:30)在今天(08/18)进行了最后更新的文档
  3. 明天“最新更新”的文档,只是为了说明为什么我感到困惑,为什么这不起作用。

我有以下查询:

GET test-index/testType/_search?pretty

{

"query": {

"range": {

"timestamp": {

"lte": "now-30m"

}

}

}

}

它提取今天(20分钟前)更新的记录,以及昨天更新的记录。我希望它只会在昨天刷新记录。

"hits": {

"total": 2,

"max_score": 1,

"hits": [

{

"_index": "test-index",

"_type": "testType",

"_id": "AV33b_VYUyX1XZAq7NTI",

"_score": 1,

"_source": {

"timestamp": "2017-08-17T17:56:55"

}

},

{

"_index": "test-index",

"_type": "testType",

"_id": "AV33cBN4UyX1XZAq7NTJ",

"_score": 1,

"_source": {

"timestamp": "2017-08-18T17:11:12"

}

}

]

将查询更改为gte now-30m,它将按预期工作,并以明天的时间戳提取记录。如果我也将范围查询更改lte

now-1d为范围查询,则该查询将正常工作,仅显示预期的08/17记录,但我想使用一分钟作为截止时间。当我尝试做几个小时时,也可以观察到同样的不当行为。

我尝试将格式设置为,yyyy-MM-dd HH:mm:ss并且也接受ES的默认日期映射,但是没有运气。

有人知道这里可能出什么问题吗?

编辑:它似乎也拉记录为“今天”,但将来的某个时间,例如:

 {

"_index": "test-index",

"_type": "testType",

"_id": "AV33gSs6UyX1XZAq7NTS",

"_score": 1,

"_source": {

"timestamp": "2017-08-18 19:11:12"

}

}

看来这是一个精确的问题,我只是不知道问题是什么,因为一切似乎都是正确的。

回答:

我想我最终找到了根本原因。在为文档建立索引时,ES会将提供的值视为UTC日期/时间。查询时,ES使用UTC日期/时间now与索引的时间戳进行比较。

假设我比UTC落后5个小时,并且正在使用本地日期/时区为文档编制索引,那么我的查询实际上是在说“给我少于5个小时-从现在开始30分钟的日期。

这是我最终编写的查询,以查看它在字面上进行比较的值,以及为实现布尔查询内部的“预期”结果而要做的事情:

GET test-index/testType/_search?pretty

{

"query": {

"bool" : {

"must" : {

"script" : {

"script" : {

"inline": "doc['timestamp'].value < new Date().getTime() - (5 * 60 * 60 * 1000) - (120 * 60 * 1000)",

"lang": "painless"

}

}

}

}

},

"script_fields": {

"timestampValue" : {

"script" : "doc['timestamp'].value"

},

"valueTimestampMustBeLessThan" : {

"script" : "new Date().getTime() - (120 * 60 * 1000)"

},

"now" : {

"script" : "new Date().getTime()"

},

"subtract": {

"script": "(120 * 60 * 1000)"

},

"timestamp" : {

"script" : "doc['timestamp']"

},

"lt?" : {

"script" : "doc['timestamp'].value < new Date().getTime() - (120 * 60 * 1000)"

},

"gt?" : {

"script" : "doc['timestamp'].value > new Date().getTime() - (120 * 60 * 1000)"

}

}

}

一个例子:

  • 我在2017年8月18日下午6:40左右插入的文档读取其UTC时间为该时间,而其“本地”时间为1:40 pm。
  • 我在2017年8月18日下午6:41左右运行的查询读取now的UTC时间为11:41 pm,其“本地”时间为6:41 pm。

ES文档中有很多地方提到它使用UTC中的日期,例如:

  • https://www.elastic.co/guide/zh-CN/elasticsearch/reference/current/date.html
  • https://www.elastic.co/guide/zh-CN/elasticsearch/reference/current/query-dsl-range-query.html#CO160-2

但是直到现在我还是完全不了解其中的含义。

在执行操作时,我只需要确保我的应用插入了UTC时间,尤其是在给定时区的情况下。

以上是 查询以提取超过30m年前更新的时间戳不起作用 的全部内容, 来源链接: utcz.com/qa/403757.html

回到顶部