Одним из способов достижения этого является использование загрузки конвейеров и запись значения _ingest.timestamp
в документе.
Сначала создайте следующий конвейер загрузки:
PUT _ingest/pipeline/set_timestamp
{
"description": "adds the timestamp when a document is indexed",
"processors": [
{
"set": {
"field": "indexed_at",
"value": "{{_ingest.timestamp}}"
}
}
]
}
Затем при индексации новых документов просто укажите этот конвейер в вашем запросе:
PUT tmp/_doc/1?pipeline=set_timestamp
{
"test": "foo"
}
И ваш документ будет содержатьновое поле с именем indexed_at
, содержащее точную временную метку, по которой оно было проиндексировано:
GET tmp/_doc/1
{
"test" : "foo",
"indexed_at" : "2019-10-03T13:19:03.181Z"
}
ОБНОВЛЕНИЕ:
Поскольку вы используете API обновления с документомКстати, у вас нет доступа к каналам приема. Вместо этого я предлагаю scripted_upsert
, например:
POST test/_update/document_id
{
"scripted_upsert":true,
"script": {
"source": """
// update all fields
ctx._source.putAll(params);
// add timestamp the first time
if (ctx._source.indexed_at == null) {
def now = Instant.ofEpochMilli(new Date().getTime());
ZonedDateTime zdt = ZonedDateTime.ofInstant(now, ZoneId.of('Z'));
ctx._source.indexed_at = zdt.format(DateTimeFormatter.ISO_INSTANT);
}
""",
"params": {
"field1": "value1",
"field2": "value2",
"field3": "value3",
"relationship": {
"parent": "child"
}
}
},
"upsert": {}
}