我在ElasticSearch中有类似以下内容的文档:
{ "numberOfBedrooms": 2, "price": 1500, "type": flat }
我想要一些统计数据,比如每个房间的平均价格是多少,每个类型的平均价格是多少,还有每个房间+类型的组合的平均价格是多少。我如何在ElasticSearch中使用聚合来实现这一点?
谢谢!
mo49yndu1#
要按房间数量显示平均价格,请创建一个具有两层嵌套聚合的查询。
例如,此查询:
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" } } } } }
1条答案
按热度按时间mo49yndu1#
要按房间数量显示平均价格,请创建一个具有两层嵌套聚合的查询。
例如,此查询:
应该返回类似如下的内容:
要在另一个级别上进行聚合(例如,添加建筑类型),您可以创建一个新的聚合级别--例如,将“类型”聚合嵌套在“卧室”聚合中。
或者,您可以使用脚本创建包含两个字段的单个存储桶: