Я предложил следующее решение, в котором я использовал нижеуказанные агрегационные запросы.Обратите внимание на древовидную структуру запроса, которая поможет понять агрегаты родителя / брата.
Range Query
Теперь я просто использовалRange Range сначала фильтрует документы, попадающие в этот диапазон.
Для простоты я рассмотрел использование нижеприведенного запроса, который вернул бы список сотрудников, чья посещаемость больше или равна 80% с 1st-Jan-2019 to 10th-Jan-2019
то есть только на 10 дней .
Обратите внимание, что я добавил несколько комментариев, где бы это ни требовалось, чтобы изменить запрос в зависимости от вашего варианта использования
Aggregation Query
POST <your_index_name>/_search
{
"size": 0,
"query":{
"range": {
"availabilityDates": {
"gte": "2019-01-01",
"lte": "2019-01-10"
}
}
},
"aggs":{
"student":{
"terms":{
"field":"userId.keyword"
},
"aggs":{
"count_dates_attendance":{
"cardinality":{
"field":"availabilityDates"
}
},
"hits": {
"top_hits": {
"size": 10 <---- Returns only 10 students. Change to see more students
}
},
"myfinal":{
"bucket_selector":{
"buckets_path":{
"attendanceCount":"count_dates_attendance"
},
"script": {
"params": {
"count_days": 10 <----- Change this to 365 if your range is for an entire year
},
"inline": "params.attendanceCount/params.count_days >= 0.8"
}
}
}
}
}
}
}
Единственное, что вам нужноdo - вручную рассчитать количество дней между двумя днями и обновить count_days
в соответствии с вашими требованиями.Я добавил 10, потому что это диапазон, который я использовал в своем запросе.
Надеюсь, это поможет!