我在elasticsearch中有类似的文件:
{
"numberOfBedrooms": 2,
"price": 1500,
"type": flat
}
我想获得统计数据,比如房间的平均价格,按类型划分的平均价格,以及每个数量的平均价格或房间类型组合的组合。如何在弹性搜索中使用聚合来实现这一目标?
谢谢!
答案 0 :(得分:1)
要按房间数显示平均价格,请创建一个包含两级嵌套聚合的查询。
例如此查询:
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" } }
}
}
}