Обновление по запросу: встроенный скрипт ctx с несколькими операторами терпит неудачу, если один или несколько элементов не совпадают?

Я использую приведенный ниже встроенный скрипт с обновлением по запросу для обновления 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. Это возможно?

Вы имеете в виду, что в некоторых документах нет поля с именем fields. Можете ли вы показать ошибку, которую вы получаете?

Val 21.05.2019 10:29

@Val Да, в некоторых документах нет этого поля. Я обновил ошибку в исходном сообщении.

Koshur 21.05.2019 10:37
0
2
1 820
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Затем просто обновите свой скрипт следующим образом:

"source": "ctx._source.approved = true; if (ctx._source.fields != null) { ctx._source.fields.lastModifiedDate = ['2019-05-21T06:16:05.133Z'];}"

Я новичок в использовании эластичных материалов и не знал об утверждениях if в эластичных. Ваше решение кажется идеальным для рассматриваемой проблемы.

Koshur 21.05.2019 11:09

Круто, рад, что помогло! Язык сценариев под названием Painless является полноценным языком сценариев: elastic.co/guide/en/elasticsearch/reference/current/….

Val 21.05.2019 11:12

Другие вопросы по теме