我试图在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”作为桶密钥。
答案 0 :(得分:0)
似乎问题是在索引期间使用JSON字符串。我把它编入索引如下:
curl -XPOST 'http://localhost:9200/datastore/files' -d '{
"version": "0"
}'
应该在哪里
curl -XPOST 'http://localhost:9200/datastore/files' -d '{
"version": 0
}'
如果JSON值是实际长度,看起来毫秒只会被视为毫秒。否则,使用标准日期日期时间格式,零被解释为零年。