Я использую приведенный ниже встроенный скрипт с обновлением по запросу для обновления approved=true
в эластичности и временной метки lastModifiedDate
.
POST /limp-access/_update_by_query
{
"query": {
"terms": {
"_id": [
"asdasfasf-laHg5qeld",
"asdfadfdfdsf-asdasd"
]
}
},
"script":{
"source": "ctx._source.approved = true; ctx._source.fields.lastModifiedDate = ['2019-05-21T06:16:05.133Z'];"
}
}
Проблема в том, что в некоторых документах вообще нет этого поля lastModifiedDate
. Поэтому всякий раз, когда он сталкивается с таким документом, он терпит неудачу с выражением нулевого указателя. Есть ли способ игнорировать такие документы и обновить тот, где он найден?
Обновлено: публикация ошибки, которую я получаю ниже:
{ "error": { "root_cause": [ { "type": "script_exception", "reason": "runtime error", "script_stack": [ "ctx._source.fields.lastModifiedDate = ['2019-05-21T06:16:05.133Z'];", " ^---- HERE" ], "script": "ctx._source.approved = true; ctx._source.fields.lastModifiedDate = ['2019-05-21T06:16:05.133Z'];", "lang": "painless" } ], "type": "script_exception", "reason": "runtime error", "script_stack": [ "ctx._source.fields.lastModifiedDate = ['2019-05-21T06:16:05.133Z'];", " ^---- HERE" ], "script": "ctx._source.approved = true; ctx._source.fields.lastModifiedDate = ['2019-05-21T06:16:05.133Z'];", "lang": "painless", "caused_by": { "type": "null_pointer_exception", "reason": null } }, "status": 500 }
Ожидается, что если в одном из идентификаторов нет поля fields
, я хочу, чтобы оно игнорировалось, а скрипт обновлял остальные документы, в которых найдено поле fields
. Это возможно?
@Val Да, в некоторых документах нет этого поля. Я обновил ошибку в исходном сообщении.
Затем просто обновите свой скрипт следующим образом:
"source": "ctx._source.approved = true; if (ctx._source.fields != null) { ctx._source.fields.lastModifiedDate = ['2019-05-21T06:16:05.133Z'];}"
Я новичок в использовании эластичных материалов и не знал об утверждениях if
в эластичных. Ваше решение кажется идеальным для рассматриваемой проблемы.
Круто, рад, что помогло! Язык сценариев под названием Painless является полноценным языком сценариев: elastic.co/guide/en/elasticsearch/reference/current/….
Вы имеете в виду, что в некоторых документах нет поля с именем
fields
. Можете ли вы показать ошибку, которую вы получаете?