Чтобы создать поле метки времени в моих индексах, в соответствии с этим ответом, я создал Ingest Pipeline для запуска определенных индексов:
PUT _ingest/pipeline/auto_now_add
{
"description": "Assigns the current date if not yet present and if the index name is whitelisted",
"processors": [
{
"script": {
"source": """
// skip if not whitelisted
if (![ "my_index_1",
"my_index_2"
].contains(ctx['_index'])) { return; }
// always update updated_at
ctx['updated_at'] = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
"""
}
}
]
}
затем я применяю ко всем настройкам индексов как конвейер по умолчанию
PUT _all/_settings
{
"index": {
"default_pipeline": "auto_now_add"
}
}
После этого я начинаю индексировать свои объекты в эти индексы. Когда я запрашиваю проиндексированный элемент, я получу этот элемент с полем updated_at
, обновленным во время индексации, например:
{
_index: 'my_index_1',
_type: '_doc',
_id: 'r1285044056',
_version: 11,
_seq_no: 373,
_primary_term: 2,
found: true,
_source: {
updated_at: '2021-07-07 04:35:39',
...
}
}
Теперь я хотел бы иметь поле created_at
, которое обновляется только в первый раз, поэтому я попытался обновить скрипт выше следующим образом:
PUT _ingest/pipeline/auto_now_add
{
"description": "Assigns the current date if not yet present and if the index name is whitelisted",
"processors": [
{
"script": {
"source": """
// skip if not whitelisted
if (![ "my_index_1",
"my_index_2",
"..."
].contains(ctx['_index'])) { return; }
// always update updated_at
ctx['updated_at'] = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
// don't overwrite if present
if (ctx != null && ctx['created_at'] != null) { return; }
ctx['created_at'] = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
"""
}
}
]
}
но это решение, похоже, не работает: условие
if (ctx != null && ctx['created_at'] != null) { return; }
всегда будет давать сбой, что приведет к обновлению created_at
при каждом обновлении объекта в индексе, точно так же, как и поле updated_at
, что сделает его бесполезным. Итак, как предотвратить это и убедиться, что это поле created_at
существует после того, как оно было создано конвейером загрузки?
doc
в скрипте? Я не могу использовать напрямуюif (doc['created_at'] != null) { return; }
также синтаксисctx._source
, который не поддерживается в процессорах, так как должен использоваться синтаксисctx[my_field]
. - person loretoparisi   schedule 07.07.2021