聚合按Elasticsearch中的参数分组

时间:2014-12-20 20:49:23

标签: elasticsearch pyelasticsearch

我在elasticsearch中有类似的文件:

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

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

谢谢!

1 个答案:

答案 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" } }
            }
          }
        }