Elasticsearch 删除具有特定日期时间的所有嵌套对象

Elasticsearch Deleting all nested object with a specific datetime

我使用的是 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 字段的多个嵌套对象。我尝试了多种方法,但 none 有效,它们 运行 正确但不删除目标对象

您可以使用 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')"
  }
}

能够通过循环并使用 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"]}}
         ]}}
    }