Elasticsearch按日期查询返回错误结果

本文关键字:错误 结果 返回 查询 日期 Elasticsearch | 更新日期: 2023-09-27 17:54:06

所以,我有一系列的文档存储为纯Json在一个NoSQL数据库(Couchbase)。这些文档包括一个"Created"字段,其中包含一个DateTime值。我正在通过Elasticsearch执行以下查询,它返回的结果是我不希望它返回的。

查询:

"query":
{ 
"bool": 
{
    "must": [
    {
        "range": 
        {
            "couchbaseDocument.doc.Created": 
            { 
                "from":"2014-03-27T00:00:00.0000000",
                "to": "2014-03-27T23:59:00.0000000"
            }
        }
    },
    {
        "term":
        {
            "couchbaseDocument.meta.expiration": "0"
        }
    }],
    "must_not": [ ],
    "should": [ ]
}, 
from: 0, 
size:25000  
}

我希望这个查询只返回3月27日期间创建日期的结果。然而,我从3月26日得到了一些结果。例如,它返回一个文档,其中创建了以下字段:

"Created": "2014-03-26T21:40:26.2856631-04:00"

为什么在结果集中返回这个文档?

Elasticsearch按日期查询返回错误结果

查询的日期/时间为GMT时区(即UTC;也就是祖鲁时间),也就是说在它们的末尾有一个隐含的+00:00

"from" : "2014-03-27T00:00:00.0000000+00:00",
"to"   : "2014-03-27T23:59:00.0000000+00:00"

GMT是一个非常标准的存储日期/时间的时区,但是看起来您的文档存储在不同的时区(它们似乎是晚EDT或AST,这是大西洋时区),这是-04:00或比GMT晚4小时。因此,当它是midnight on March 27, 2014 in GMT时,它仍然是8 PM on March 26, 2014 in AST(晚上8点是一天的第20小时)。

本质上,当您看到-04:00时,您需要将添加 04:00到时间中,即4小时零分钟。完成后,您可以删除时区标记,因为:

2014-03-26T21:40:26.2856631-04:00

相同
2014-03-27T01:40:26.2856631+00:00

相同
2014-03-27T01:40:26.2856631

因为21 + 04 = 25,并且一天的25小时是下一个天(25 - 24 = 01)的01小时,因此给出1天1小时;值得注意的是,24 - 24 = 00,这就是为什么00代表午夜)。

回到这个问题:返回的时间应该在你的结果中,因为相对于GMT,它在你的搜索范围内。

为参考,EST为-05:00, PST为-08:00