Я сохраняю результаты соревнований по плаванию, чтобы упростить поиск и представлять данные по-разному. Каждый результат сохраняется как отдельный документ, время в миллис. Как это:
{
"swimmer": "xyz123",
"stroke": "butterfly",
"distance": 25,
"time": 20250
}
Тем не менее, для молодых пловцов есть награда, когда они достигают определенного времени в пяти различных типах событий (различные удары), и я хотел бы иметь возможность найти всех пловцов, у которых время меньше указанного времени во всех пять событий (разное время для разных событий).
Пример:
Средний кубок присуждается, когда пловец выполнил:
- 50 м на спине за 47 секунд или меньше
- 50 м бесплатно (ползать) за 31 секунду или меньше
- 50-метровый удар молочной железы за 51 секунду или менее
- 25-метровая бабочка за 22 секунды или меньше
- 100м попурри за 1м40 с или менее.
Я пытался использовать запрос bool / should, состоящий из запроса bool / must, для каждого из ограничений на удар. На этом у меня есть агрегации (термин агрегация) на Swimmer -> Stroke, и я могу по количеству ведер определить, достиг ли пловец уровня за 5 ударов.
Однако, это возвращает ведро для всех пловцов, которые достигли любого из пределов, и хотя это не огромное количество пловцов (пока), я считаю, что это не будет работать в долгосрочной перспективе.
Я что-то упускаю (думая, что мне не повезло)? Кто-нибудь может порекомендовать, как добиться этого в одном запросе?
Упрощенный запрос:
{
"query": {
"bool": {
"should": [
{ //* backstroke, 50m, <47000ms *// },
{ //* freestroke, 50m, <41000ms *// },
{ //* breaststroke, 50m, <51000ms *// },
{ //* butterfly, 25m, <22000ms *// },
{ //* medley, 100m, <100000ms *// }
]
}
},
"aggs": {
"by_swimmer": {
"terms": {
"field": "swimmer"
},
"aggs": {
"by_stroke": {
"terms": {
"field": "stroke"
}
}
}
}
}
}