Возврат поля timestamp в elasticsearch
Почему я не могу увидеть поле _timestamp при возможности фильтрации запроса?
Следующий запрос возвращает правильные документы, но не сама метка времени. Как вернуть метку времени?
{
"fields": [
"_timestamp",
"_source"
],
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"range": {
"_timestamp": {
"from": "2013-01-01"
}
}
}
}
}
}
Отображение:
{
"my_doctype": {
"_timestamp": {
"enabled": "true"
},
"properties": {
"cards": {
"type": "integer"
}
}
}
}
вывод образца:
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"failed" : 0
},
"hits" : {
"total" : 2,
"max_score" : 1.0,
"hits" : [ {
"_index" : "test1",
"_type" : "doctype1",
"_id" : "HjfryYQEQL6RkEX3VOiBHQ",
"_score" : 1.0, "_source" : {"cards": "5"}
}, {
"_index" : "test1",
"_type" : "doctype1",
"_id" : "sDyHcT1BTMatjmUS0NSoEg",
"_score" : 1.0, "_source" : {"cards": "2"}
}]
}
Ответы
Ответ 1
Когда поле timestamp включено, оно индексируется, но не сохраняется по умолчанию. Таким образом, пока вы можете искать и фильтровать по полю timestamp, вы не можете легко получить его с помощью своих записей. Чтобы иметь возможность получить поле метки времени, вам необходимо воссоздать свой индекс со следующим отображением:
{
"my_doctype": {
"_timestamp": {
"enabled": "true",
"store": "yes"
},
"properties": {
...
}
}
}
Таким образом, вы сможете получить временную метку как число миллисекунд с эпохи.
Ответ 2
Нет необходимости хранить поле метки времени, так как его точное значение сохраняется как термин, который, скорее всего, уже присутствует в ОЗУ, особенно если вы запрашиваете его. Вы можете получить доступ к метке времени через свой термин, используя script_value
:
{
"query": {
...
},
"script_fields": {
"timestamp": {
"script": "_doc['_timestamp'].value"
}
}
}
Полученное значение выражается в миллисекундах с эпохи UNIX. Это довольно непристойно, что ElasticSearch не может сделать это за вас, но эй, ничего идеального.