Elasticsearch как удалить поле при переиндексации

#elasticsearch

#эластичный поиск

Вопрос:

Я пытаюсь удалить data.properties.review_meta поле, потому что это вызывает проблемы

 POST /_reindex
{
  "source": {
    "index": "analytics-prod-2020.11.05"
  },
  "dest": {
    "index": "analytics-prod-2020.11.05.02"
  },

  "conflicts": "proceed",

  "script" : {
    "source": "ctx._source.data.remove('properties.review_meta')"
  }

}
 

код не работает с сообщением об ошибке

  "failures" : [
    {
      "index" : "analytics-prod-2020.11.05.02",
      "type" : "_doc",
      "id" : "gksugnUBaMafnb1n2Iqy",
      "cause" : {
        "type" : "mapper_parsing_exception",
        "reason" : "object mapping for [data.properties.review_meta] tried to parse field [review_meta] as object, but found a concrete value"
      },
      "status" : 400
    },
    {
      "index" : "analytics-prod-2020.11.05.02",
      "type" : "_doc",
      "id" : "jUsvgnUBaMafnb1nsrkC",
      "cause" : {
        "type" : "mapper_parsing_exception",
        "reason" : "object mapping for [data.properties.review_meta] tried to parse field [review_meta] as object, but found a concrete value"
      },
      "status" : 400
    }
  ]
 

исходный индекс (2020.11.05) имеет

             "review_meta" : {
              "type" : "long"
            },
 

индекс dest(2020.11.05.02) имеет шаблон индекса

     {
      "review_meta" : {
        "match" : "review_meta",
        "mapping" : {
          "type" : "object"
        }
      }
    }
 

Ответ №1:

Вместо этого ваш сценарий должен быть таким, и тогда он будет работать:

 ctx._source.data.properties.remove('review_meta')
 

Комментарии:

1. действительно, это работает.. Мне пришлось добавить ctx._source.containsKey(‘data’) проверку и по пути

2. Круто, рад, что это помогло. Действительно, вам нужно убедиться, что ключи существуют, хороший момент.