У меня есть следующий набор данных
[
{
"rating": "10",
"subject": "maths"
},
{
"rating": "9",
"subject": "physics"
},
{
"rating": "10",
"subject": "chemistry"
},
{
"rating": "5",
"subject": "physics"
},
{
"rating": "2",
"subject": "geography"
},
{
"rating": "5",
"subject": "maths"
},
{
"rating": "1",
"subject": "geography"
},
{
"rating": "5",
"subject": "maths"
},
{
"rating": "8",
"subject": "chemistry"
}
]
Что мне нужно сделать, так это найти среднюю оценку по каждому предмету, а затем рассчитать количество предметов в диапазонах оценок (0-2,2-5,5-8,8-10) с помощью эластичного поискового запроса. .
Мой запрос создает группы для каждого субъекта, вычисляя среднее значение для каждой группы. Но я не могу найти, как выполнить агрегацию диапазона по результату составной агрегации. Это вообще возможно? Есть ли альтернатива?
Вот мой запрос, который группирует данные в соответствии с темой и вычисляет среднюю оценку.
GET kibana_sample/_search
{
"size":0,
"aggs" : {
"my_buckets": {
"composite" : {
"sources" : [
{ "subject": { "terms" : { "field": "subject" } } }
]
},
"aggs": {
"avg_rating": {
"avg" : { "field" : "rating" }
}
}
}
}
}
Это приводит к следующему.
"aggregations": {
"my_buckets": {
"buckets": [
{
"key": {
"subject": "maths"
},
"doc_count": 3,
"avg_rating": {
"value": 6.66666667
}
},
{
"key": {
"subject": "physics"
},
"doc_count": 2,
"avg_rating": {
"value": 7
}
},
{
"key": {
"subject": "chemistry"
},
"doc_count": 2,
"avg_rating": {
"value": 9
}
},
{
"key": {
"subject": "geography"
},
"doc_count": 2,
"avg_rating": {
"value": 1.5
}
}
]
}
}
Это все хорошо, но теперь мне нужно выполнить агрегацию диапазонов поверх этого результата, чтобы получить количество предметов в диапазонах оценок.
например:
диапазон оценок: {0-2}: 1 предмет, {2-5}: 0 предметов, {5-8}: 2 предмета,
{8-10}: 1 предмет