Elasticsearch Удаление всех вложенных объектов с определенной датой и временем

Я использую Elasticsearch 5.6, и у меня есть вложенное поле schedule с вложенными объектами, которые выглядят так

{
              "status": "open",
              "starts_at": "2020-10-13T17:00:00-05:00",
              "ends_at": "2020-10-13T18:00:00-05:00"
            },
            {
              "status": "open",
              "starts_at": "2020-10-13T18:00:00-05:00",
              "ends_at": "2020-10-13T19:30:00-05:00"
            }

то, что я ищу, - это запрос Painless, который удалит несколько вложенных объектов, равных полю starts_at. Я пробовал несколько способов, но ни один из них не работал, они работают правильно, но не удаляют целевые объекты.


person Maged Makled    schedule 10.11.2020    source источник
comment
Поделитесь своим текущим запросом — возможно, мы сможем его настроить.   -  person Joe Sorocin    schedule 11.11.2020


Ответы (2)


Удалось сделать это, зациклившись на нем и используя SimpleDateFormat

POST index/_update_by_query
    {
    "script": {"source": "for(int i=0;i< ctx._source.schedule.length;i++){ 
                               SimpleDateFormat sdformat = new SimpleDateFormat('yyyy-MM-dd\\'T\\'HH:mm:ss'); 
                               boolean equalDateTime = sdformat.parse(ctx._source.schedule[i].starts_at).compareTo(sdformat.parse(params.starts_at)) == 0; 
                               if(equalDateTime) {
                                ctx._source.schedule.remove(i)
                               }
                           }",
                           "params": {
                                      "starts_at": "2020-10-13T17:00:00-05:00"
                                     },
                           "lang": "painless"
    },
      "query":{
        "bool": {"must":[
          {"terms":{"_id":["12345"]}}
         ]}}
    }
person Maged Makled    schedule 12.11.2020

Вы можете использовать UpdateByQuery. для того же.

POST <indexName>/<type>/_update_by_query
{
  "query":{ // <======== Filter out the parent documents containing the specified nested date
    "match": {
      "schedule.starts_at": "2020-10-13T17:00:00-05:00"
    }
  },
  "script":{ // <============ use the script to remove the schedule containing specific start date
    "inline": "ctx._source.schedule.removeIf(e -> e.starts_at == '2020-10-13T17:00:00-05:00')"
  }
}
person Sahil Gupta    schedule 11.11.2020
comment
Не сработает, так как сравнение полей даты не будет работать с == - person Maged Makled; 12.11.2020