Эластичный поиск как удалить свойство объекта с помощью безболезненного

#elasticsearch #kibana #elasticsearch-painless

Вопрос:

Интересно, знает ли кто-нибудь, почему это обновление по запросу выполняется нормально, но ничего не удаляется, даже если задача выполняется до завершения и утверждает, что все записи обновлены? Я могу использовать один и тот же синтаксис для удаления всех объектов person без каких-либо проблем. Почему ES не удаляет свойства объекта?

 POST /16cf303e902f4445a560a8e9a5b9ea51/_update_by_query?conflicts=proceedamp;wait_for_completion=false
{
  
  "conflicts": "proceed",
  "query": {
    "exists": {
      "field": "person.hair_color"
    }
  },
  "script": {
    "lang": "painless",
    "source": "ctx._source.remove('person.hair_color');"
  }
}
 

Теперь, если я посмотрю задачу, используя идентификатор, возвращенный из приведенного выше вызова

GET /_tasks/qLeuj8jqQgOPFGsEzL7u9Q:1776664

Я получаю эту (сокращенную версию), утверждающую, что все документы были обновлены. Однако по какой-то причине у всех людей все еще есть цвет волос.

 {
  "completed" : true,
  "task" : {
    "status" : {
      "updated" : 110345,
     }
}
 

Спасибо за любые рекомендации!

Ответ №1:

Наконец-то я это понял! По-видимому, _source содержит все объекты в вашем документе. Поэтому, чтобы удалить свойство объекта, вам необходимо запустить:

 POST /16cf303e902f4445a560a8e9a5b9ea51/_update_by_query?conflicts=proceedamp;wait_for_completion=false
{
  
  "conflicts": "proceed",
  "query": {
    "exists": {
      "field": "person.hair_color"
    }
  },
  "script": {
    "lang": "painless",
    "source": "ctx._source.person.remove('hair_color');"
  }
}

 

Это работает, если у кого-то такая же проблема!