Возврат поля 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 не может сделать это за вас, но эй, ничего идеального.