Elasticsearch 搜索条件与聚合结果再进行过滤的多重聚合查询–过滤桶的使用(六)
实现的需求:数据分析的大范围是福特的车子,而且还需要上个月这个牌子的汽车的平均售价
需求分析:
Rest-Api
java-api
查询结果
本篇文章使用到的数据仍旧引用第一篇的数据 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”
}
}
}
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
查询结果
{
“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
}
}
}
}
作者:ydw_ 武汉
来源:CSDN
原文:https://blog.csdn.net/ydwyyy/article/details/79682388
版权声明:本文为博主原创文章,转载请附上博文链接!