elasticsearch,Spring,Spring Boot,elasticsearch" /> elasticsearch,Spring,Spring Boot,elasticsearch" />

Spring数据弹性按日期范围分组搜索计数

Spring数据弹性按日期范围分组搜索计数,spring,spring-boot,elasticsearch,Spring,Spring Boot,elasticsearch,我使用spring数据弹性搜索,在弹性搜索中有一个此列表 {"appUserId": "id-test-app-user11", "apkId": 1, "event": "INSTALL", "date": "2020-06-01"} ... {"appUserId": "id-test-app-user168&qu

我使用spring数据弹性搜索,在弹性搜索中有一个此列表

{"appUserId": "id-test-app-user11",   "apkId": 1,   "event": "INSTALL",  "date": "2020-06-01"}
...
{"appUserId": "id-test-app-user168",   "apkId": 1,   "event": "INSTALL",  "date": "2020-12-06"}
我想按天计算一个日期范围内的apkId的安装数量

通过这个请求,我可以获得日期范围和参数中提供的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));


return apkHistoryRepo.search(query);
但我不知道如何按日期进行聚合,以获得类似的结果

{"2020-06-01": "500"}
...
{"2020-12-06": "10"}
请问我怎样才能做到这一点? 提前感谢

您正在寻找聚合。以下是如何在查询中使用它

{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "apkId": "1"
          }
        },
        {
          "term": {
            "event": "INSTALL"
          }
        },
        {
          "range": {
            "date": {
              "gte": <start_date_here>,
              "lte": <end_date_here>
            }
          }
        }
      ]
    }
  },
  "aggs": {
    "per_day_count": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "1d"
      }
    }
  }
}
{
“查询”:{
“布尔”:{
“必须”:[
{
“期限”:{
“apkId”:“1”
}
},
{
“期限”:{
“事件”:“安装”
}
},
{
“范围”:{
“日期”:{
“gte”:,
“lte”:
}
}
}
]
}
},
“aggs”:{
“每天计数”:{
“日期直方图”:{
“字段”:“日期”,
“日历间隔”:“1d”
}
}
}
}
Java最终解决方案

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");

        List<? extends Histogram.Bucket> bucketList = dateGroupBy.getBuckets();
        for(Bucket b : bucketList) {
            
            System.out.println(b.getKeyAsString() + " "+b.getDocCount());
            
        }
            System.out.println("test");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
localdatetoday=LocalDate.now();
LocalDate beginningDate=今天。最小天数(间隔);
BoolQueryBuilder query=QueryBuilders.boolQuery();
query.must(QueryBuilders.rangeQuery(“日期”)
.gte(开始日期)
.lte(今日));
query.must(QueryBuilders.matchQuery(“apkId”,apkId));
query.must(QueryBuilders.matchQuery(“event”,event.INSTALL));
Iterable list=apkHistoryRepo.search(查询);
AggregationBuilder聚合=AggregationBuilders
.dateHistogram(“nb_安装日”)
.字段(“日期”)
.DateHistorograminterval(DateHistorograminterval.DAY);
SearchRequest SearchRequest=新的SearchRequest(“apkhistory”);
SearchSourceBuilder SearchSourceBuilder=新的SearchSourceBuilder();
searchSourceBuilder.query(查询).aggregation(聚合);
searchRequest.source(searchSourceBuilder);
试一试{
SearchResponse SearchResponse=client.search(searchRequest,RequestOptions.DEFAULT);
ParsedDateHistogram dateGroupBy=searchResponse.getAggregations().get(“nb_每天安装”);

谢谢你的anwser。你知道或有QueryBuilders的例子吗?