I'm counting per day the number of install by apkId.
LocalDate today = LocalDate.now();
LocalDate beginningDate = today.minusDays(intervalle);
BoolQueryBuilder query = QueryBuilders.boolQuery();
query.must(QueryBuilders.rangeQuery("date")
.gte(convertToDateViaInstant(beginningDate))
.lte(convertToDateViaInstant(today)));
query.must(QueryBuilders.matchQuery("apkId", apkId));
query.must(QueryBuilders.matchQuery("event", Event.INSTALL));
Iterable<ApkHistory> list = apkHistoryRepo.search(query);
AggregationBuilder aggregation = AggregationBuilders
.dateHistogram("nb_install_per_day")
.field("date")
.dateHistogramInterval(DateHistogramInterval.DAY);
SearchRequest searchRequest = new SearchRequest("apkhistory");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(query).aggregation(aggregation);
searchRequest.source(searchSourceBuilder);
try {
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
Aggregation agg = searchResponse.getAggregations().get("nb_install_per_day");
System.out.println("test");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
The search response return a correct json in which i can see the result i'm looking for.
{
"took":70,
"timed_out":false,
"_shards":{
"total":5,
"successful":5,
"skipped":0,
"failed":0
},
"hits":{
"total":34,
"max_score":2.0042462,
"hits":[
{
"_index":"apkhistory",
"_type":"apkhistory",
"_id":"mQw_OnYBj8D21YQgTRHA",
"_score":2.0042462,
"_source":{
"appUserId":"rsty-45ts-8978HU9",
"apkId":1,
"event":"INSTALL",
"date":1605481200000
}
},
{
"_index":"apkhistory",
"_type":"apkhistory",
"_id":"-wwPOnYBj8D21YQgdA9Q",
"_score":2.0042462,
"_source":{
"appUserId":"id-test-app-user95",
"apkId":1,
"event":"INSTALL",
"date":1605654000000
}
}...
}
]
},
"aggregations":{
"date_histogram#per_day_count":{
"buckets":[
{
"key_as_string":"2020-11-07T00:00:00.000Z",
"key":1604707200000,
"doc_count":2
},
{
"key_as_string":"2020-11-08T00:00:00.000Z",
"key":1604793600000,
"doc_count":2
}...
]
}
} }
When I tried to get the buckets, it is impossible. I don't have the method getBuckets()
in Aggregation.
When I tried Terms terms = searchResponse.getAggregations().get("nb_install_per_day")
, I got an exception, cannot convert Aggregations to Terms
Please, how could I do to get this buckets values ?
I use Spring 2.2.4
and spring data elastic search 3.2.4.RELEASE
.
Thanks
Here the content of my variable. In agg I have no method to get buckets ArrayList...I tried many ways without success. Please help.
LocalDate today = LocalDate.now();
LocalDate beginningDate = today.minusDays(intervalle);
BoolQueryBuilder query = QueryBuilders.boolQuery();
query.must(QueryBuilders.rangeQuery("date")
.gte(beginningDate)
.lte(today));
query.must(QueryBuilders.matchQuery("apkId", apkId));
query.must(QueryBuilders.matchQuery("event", Event.INSTALL));
Iterable<ApkHistory> list = apkHistoryRepo.search(query);
AggregationBuilder aggregation = AggregationBuilders
.dateHistogram("nb_install_per_day")
.field("date")
.dateHistogramInterval(DateHistogramInterval.DAY);
SearchRequest searchRequest = new SearchRequest("apkhistory");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(query).aggregation(aggregation);
searchRequest.source(searchSourceBuilder);
try {
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
ParsedDateHistogram dateGroupBy = searchResponse.getAggregations().get("nb_install_per_day");
for(org.elasticsearch.search.aggregations.bucket.histogram.Histogram.Bucket b : dateGroupBy.getBuckets()) {
System.out.println(b.getKeyAsString() + " "+b.getDocCount());
}
System.out.println("test");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}