#elasticsearch #elasticsearch-5 #elasticsearch-painless
#elasticsearch #elasticsearch-5 #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
полю. Я пробовал несколько способов, но ни один из них не сработал, они работают правильно, но не удаляют целевые объекты
Комментарии:
1. Поделитесь своим текущим запросом — возможно, мы сможем его точно настроить.
Ответ №1:
Смог сделать это, зациклившись на нем и используя 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"]}}
]}}
}
Ответ №2:
Вы можете использовать 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')"
}
}
Комментарии:
1. Не сработает, поскольку это поле даты, с которым сравнение не будет работать
==