Как мне перезаписать поле @timestamp другим полем в Elasticsearch?

#elasticsearch

#elasticsearch

Вопрос:

Я неправильно загрузил множество документов в Elasticsearch, используя неправильное @timestamp поле. Я уже изменил затронутый конвейер Logstash, чтобы использовать правильные временные метки, но я не могу повторно использовать старые данные.

Однако у меня есть другое поле документа, которое можно использовать в качестве метки времени ( json.created_at ). Итак, я хотел бы обновить поле. Я обнаружил, что могу использовать _update_by_query действие для этого, но я попробовал несколько версий, которые не сработали, включая эту:

 POST logstash-rails_models-*/_update_by_query
{
  "script": {
    "lang": "painless",
    "source": "ctx._source.@timestamp = ctx._source.json.created_at"
  }
}
  

Это сообщение жалуется на неожиданный символ:

 {
  "error": {
    "root_cause": [
      {
        "type": "script_exception",
        "reason": "compile error",
        "script_stack": [
          "ctx._source.@timestamp = ctx._source. ...",
          "            ^---- HERE"
        ],
        "script": "ctx._source.@timestamp = ctx._source.json.created_at",
        "lang": "painless"
      }
    ],
    "type": "script_exception",
    "reason": "compile error",
    "script_stack": [
      "ctx._source.@timestamp = ctx._source. ...",
      "            ^---- HERE"
    ],
    "script": "ctx._source.@timestamp = ctx._source.json.created_at",
    "lang": "painless",
    "caused_by": {
      "type": "illegal_argument_exception",
      "reason": "unexpected character [@].",
      "caused_by": {
        "type": "lexer_no_viable_alt_exception",
        "reason": null
      }
    }
  },
  "status": 500
}
  

Что мне делать?

Ответ №1:

Правильный способ доступа к этому полю — использовать скобки и заключать в кавычки:

 POST logstash-rails_models-*/_update_by_query
{
  "script": {
    "lang": "painless",
    "source": "ctx._source['@timestamp'] = ctx._source.json.created_at"
  }
}
  

Смотрите также Этот поток и еще немного информации об обновлении полей с помощью безболезненного.