Elasticsearch 搜索条件与聚合结果再进行过滤的多重聚合查询-过滤桶的使用(六)

本篇文章使用到的数据仍旧引用第一篇的数据ElasticSearch超强聚合查询(一)

本节主要讲解关于针对聚合结果进行一个过滤

实现的需求:数据分析的大范围是福特的车子,而且还需要上个月这个牌子的汽车的平均售价

需求分析:

  • 分析牌子为福特的车子–>第一个查询范围的限定的查询条件Q
  • 需要分析车子的平均–>第二个查询条件A
  • 查询的售价区间是上个月的–>第三个条件B

条件A是属于聚合查询条件,在这个条件的的条件B则可以通过过滤桶来进行实现.

Rest-Api

GET /cars/transactions/_search
{
   "size" : 0,
   "query":{
      "match": {
         "make": "ford"
      }
   },
   "aggs":{
      "recent_sales": {
         "filter": { 
            "range": {
               "sold": {
                  "from": "now-1M"
               }
            }
         },
         "aggs": {
            "average_price":{
               "avg": {
                  "field": "price" 
               }
            }
         }
      }
   }
}

java-api

    @Test
    public void filterBulk(){
        SearchResponse response = transportClient.prepareSearch("cars")
                .setTypes("transactions")
                .setQuery(
                        //查找条件
                        QueryBuilders.matchQuery("make","ford")
                )
                .addAggregation(

                        AggregationBuilders.filter("range",QueryBuilders.rangeQuery("sold").from("now-1M"))//这一步必须在前面否则过滤器会无效,巨坑,笔者被坑了好久才找到原因
                        .subAggregation(AggregationBuilders.avg("single_avg_price").field("price"))
                )

                .get();

        Aggregation avg_price_name = response.getAggregations().get("single_avg_price");
        System.out.println(avg_price_name);
    }

查询结果

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.6931472,
    "hits": [
      {
        "_index": "cars",
        "_type": "transactions",
        "_id": "AWIFx7jO5idSEZHc8G0Q",
        "_score": 0.6931472,
        "_source": {
          "price": 30000,
          "color": "green",
          "make": "ford",
          "sold": "2014-05-18"
        }
      }
    ]
  },
  "aggregations": {
    "range": {
      "doc_count": 0,
      "single_avg_price": {
      //因为我们查的是上一个月的,笔者的查询时间是2018年3月份,因为在数据库中上个月没有数据记录,所以上个月的平均值是Null
        "value": null
      }
    }
  }
}

猜你喜欢

转载自blog.csdn.net/tiansheng1225/article/details/81707220