1

我在 elasticsearch 中有类似的文档:

{ "numberOfBedrooms": 2, "price": 1500, "type": flat }

我想获得统计数据,例如按房间划分的平均价格是多少,按类型划分的平均价格是多少,以及组合的平均价格是多少,例如每个 numberOfBedroom+type 组合的平均价格是多少。如何在弹性搜索中使用聚合来实现这一目标?

谢谢!

4

1 回答 1

2

要按房间数显示平均价格,请创建一个具有两级嵌套聚合的查询。

  • 第一级 - 使用术语聚合来逐步了解卧室大小
  • 2 级 - 计算当前卧室尺寸的平均价格

例如这个查询:

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" } }
            }
          }
        }
于 2014-12-20T21:38:49.470 回答