聚合日期字段,其中存储日期值,以毫秒为单位

时间:2015-03-11 07:04:04

标签: elasticsearch

我试图在elasticsearch中的日期字段中存储自UNIX EPOCH以来的毫秒数。这应该可以在在线指南中说明:

  

日期类型还将接受表示自纪元以来UTC毫秒的长数,无论其处理的格式如何。   http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-core-types.html

这样做的原因是我有一个文件集合,其版本也是创建它们的时间戳。因此,我定义了以下索引和映射(示例):

curl -XPUT 'http://localhost:9200/datastore'`

curl -XPUT 'http://localhost:9200/datastore/_mapping/files' -d '
{
    "files" : {
        "properties" : {
            "version" : {
                "type" : "date"
            }
        }
    }
}'

存储毫秒后如下:

curl -XPOST 'http://localhost:9200/datastore/files' -d '{
    "version": "0"
}'

我使用普通查询检索字段,它回来了:

curl -XGET "http://127.0.0.1:9200/datastore/_search?pretty" -d '{
    "fields" : ["version"]
}'

回应:

{
  "took" : 3,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 1.0,
    "hits" : [ {
      "_index" : "datastore",
      "_type" : "files",
      "_id" : "AUwHnaoalv87gaUunUaf",
      "_score" : 1.0,
      "fields" : {
        "version" : [ "0" ]
      }
    } ]
  }
}

但是,当我尝试在字段上聚合时,这些值现在突然被解释为从0年开始的毫秒数。不同的值将作为每个容器的键返回:

curl -XGET "http://localhost:9200/datastore/_search?pretty" -d '{
    "aggs": {
        "uniqueVersions": {
            "terms": {
                "field": "version"
            }
        }
    }
}'

响应:

{
  "took" : 93,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 1.0,
    "hits" : [ {
      "_index" : "datastore",
      "_type" : "files",
      "_id" : "AUwHnaoalv87gaUunUaf",
      "_score" : 1.0,
      "_source":{
    "version": "0"
}
    } ]
  },
  "aggregations" : {
    "uniqueVersions" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [ {
        "key" : -62167219200000,
        "key_as_string" : "0000-01-01T00:00:00.000Z",
        "doc_count" : 1
      } ]
    }
  }
}

正如您所看到的,现在关键是实际零年。我想知道为什么会这样,因为我期待“0”作为桶密钥。

1 个答案:

答案 0 :(得分:0)

似乎问题是在索引期间使用JSON字符串。我把它编入索引如下:

curl -XPOST 'http://localhost:9200/datastore/files' -d '{
    "version": "0"
}'

应该在哪里

curl -XPOST 'http://localhost:9200/datastore/files' -d '{
    "version": 0
}'

如果JSON值是实际长度,看起来毫秒只会被视为毫秒。否则,使用标准日期日期时间格式,零被解释为零年。