Search code examples
springelasticsearchspring-data-elasticsearch

Elastic search : Impossible to get buckets result


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.4and 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. enter image description here


Solution

  • 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();
        }