Elasticearch中按参数分组的聚合

rm5edbpk  于 2022-10-06  发布在  ElasticSearch
关注(0)|答案(1)|浏览(137)

我在ElasticSearch中有类似以下内容的文档:

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

我想要一些统计数据,比如每个房间的平均价格是多少,每个类型的平均价格是多少,还有每个房间+类型的组合的平均价格是多少。我如何在ElasticSearch中使用聚合来实现这一点?

谢谢!

mo49yndu

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

相关问题