Spring数据弹性按日期范围分组搜索计数
我使用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
{"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的例子吗?