Elasticsearch按日期查询返回不正确的结果

时间:2014-03-27 21:30:04

标签: c# elasticsearch couchbase

所以,我有一系列文件在NoSQL数据库(Couchbase)中存储为纯Json。这些文件包括"创建"包含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"

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

1 个答案:

答案 0 :(得分:3)

您的查询正在搜索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,Atlantic Time Zone) ,比格林威治标准时间-04:00还要落后4小时。因此,当它为midnight on March 27, 2014 in GMT时,它仍为8 PM on March 26, 2014 in AST(晚上8点是当天的第20小时)。

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

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小时是下一个01的小时25 - 24 = 01,因此给出了1天的时间1小时;值得注意的是24 - 24 = 00,这就是00代表午夜的原因。

要把它全部带回问题:返回的时间应该在你的结果中,因为关于GMT,它在你的搜索范围内。

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