elasticsearch-aggregation - 使用高级 Java 客户端 Elasticsearch 在同一级别进行多个聚合
问题描述
如何使用高级 java 客户端将具有同一级别的多个聚合的以下 dsl 查询转换为 java api?
{
"size": 0,
"aggs": {
"by_time": {
"max": {
"field": "updated_ts"
}
},
"by_question": {
"value_count": {
"field": "questions.question.keyword"
}
},
"by_score": {
"filter": {
"term": {
"score": 100
}
}
}
}
}
解决方案
嗨,如果您使用的是 ES 版本 6.8 或更低版本,请尝试使用此代码
MaxAggregationBuilder by_time = AggregationBuilders
.max("by_time")
.field("updated_ts");
ValueCountAggregationBuilder by_question = AggregationBuilders
.count("by_question")
.field("questions.question.keyword");
ValueCountAggregationBuilder by_view = AggregationBuilders
.count("by_view")
.field("questions.viewStats.name.keyword");
FilterAggregationBuilder by_score = AggregationBuilders
.filter("by_score", QueryBuilders.termQuery("score",100));
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//Setting aggregation to search request
sourceBuilder.aggregation(by_time);
sourceBuilder.aggregation(by_question);
sourceBuilder.aggregation(by_view);
sourceBuilder.aggregation(by_score);
//To avoid fetching docs
sourceBuilder.size(0);
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices(MODEL_INDEX_NAME);
searchRequest.source(sourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
//For getting result from aggregations
//Refer: https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/_structuring_aggregations.html
Max byTimeAggregationResult = searchResponse.getAggregations().get("by_time");
double byTimeMaxValue = byTimeAggregationResult.getValue();
ValueCount byQuestionAggregationResult = searchResponse.getAggregations().get("by_question");
long byQuestionCount = byQuestionAggregationResult.getValue();
ValueCount byViewAggregationResult = searchResponse.getAggregations().get("by_view");
long byViewCount = byViewAggregationResult.getValue();
Filter byScoreAggregationResult = searchResponse.getAggregations().get("by_score");
long byScoreDocCount = byScoreAggregationResult.getDocCount();
System.out.println("byTimeMaxValue: "+byTimeMaxValue);
System.out.println("byQuestionCount: "+byQuestionCount);
System.out.println("byViewCount: "+byViewCount);
System.out.println("byScoreDocCount: "+byScoreDocCount);
推荐阅读
- vue.js - 取消 vue 组件中的属性更新
- sapui5 - 使用 sapUI5 VizFrame 连接的散点图
- javascript - 使用 Jest 触发方法后检查 Vue 组件数据
- python - 使用python将相同的文本颜色excel单元格合并为一个?
- swift - 如何让用户在退出应用程序时不会收到 (APNC) 通知?
- reactjs - useEffect 导致状态在父组件中被覆盖
- kubernetes - 无法从 Kubernetes 上的 Helm 启动 Vault
- opengl - 什么时候 CUDA/OpenGL 互操作线程是安全的?
- javascript - 无法使用智能卡库从wireshark 复制数据
- css - 任何人都可以建议两列高度的引导类