Чтобы показать среднюю цену по количеству комнат, создайте запрос с двумя уровнями вложенной агрегации.
- первый уровень - использовать term aggregation пошагово спальню размеров
- второй уровень - рассчитать average цену за текущий размер спальни
Например, этот запрос:
curl -XGET 'http://localhost:9200/myindex/houses/_search?pretty&search_type=count' -d '{
"query" : {
"match_all" : { }
},
"aggs": {
"bed_agg": {
"terms": {"field": "numberOfBedrooms"},
"aggs" : {
"avg_price" : { "avg" : { "field" : "price" } }
}
}
}
}
}'
Должен вернуть что-то вроде:
"aggregations" : {
"bed_agg" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [ {
"key" : 2,
"doc_count" : 2,
"avg_price" : {
"value" : 1750.0
}
}, {
"key" : 3,
"doc_count" : 1,
"avg_price" : {
"value" : 2100.0
}
} ]
}
Для агрегации над другой уровень (например, добавление в тип здания), вы можете либо создать новый уровень агрегирования - например, гнездится «агрегат типа» внутри агрегации «спален».
curl -XGET 'http://localhost:9200/myindex/houses/_search?pretty&search_type=count' -d '{
"query" : {
"match_all" : { }
},
"aggs": {
"bed_agg": {
"terms": {"field": "numberOfBedrooms"},
"aggs": {
"type_agg": {
"terms": {"field": "type"},
"aggs" : {
"avg_price" : { "avg" : { "field" : "price" } }
}
}
}
}
}
}
}'
В качестве альтернативы вы можете создать одно ведро с обоих полей в нем с помощью сценария:
"aggs": {
"bed_type_agg": {
"terms": { "script" : "doc[\"numberOfBedrooms\"].value+doc[\"type\"].value"},
"aggs" : {
"avg_price" : { "avg" : { "field" : "price" } }
}
}
}
я, вероятно, может сделать это вручную, но мне было интересно, если есть более элегантное решение. –