Как я проверяю время создания документа ES в ES 7.3v? - PullRequest
0 голосов
/ 03 октября 2019

Я хочу знать время создания моего документа вasticsearch, есть ли какое-либо мета-поле, в котором хранится эта информация, или, если его там нет, то как мне его реализовать.

Я делаю запрос upsert каждый раз, поэтому предоставление времени невозможно.

Запрос upsert:

POST test/_update/document_id
{
"doc": {
 "field1": "value1",
 "field2": "value2",
 "field3": "value3",
 "relationship": {
  "parent": "child"
 }
},
 "doc_as_upsert": "true"
}

с использованием упругого поиска npm и следующего кода:

esDoc.doc['relationship'] = { name: "test" };
esDoc['doc_as_upsert'] = true;
bulkQueue.add({ update: { _index: ES_INDEX_PREFIX + testId, _id: _id } }, esDoc)

1 Ответ

3 голосов
/ 03 октября 2019

Одним из способов достижения этого является использование загрузки конвейеров и запись значения _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": {}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...