使用 Elasticsearch RestHighLevelClient 查询车辆统计信息
本示例展示如何使用 Elasticsearch RestHighLevelClient 查询车辆统计信息。
import org.apache.http.HttpHost;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.InternalFilter;
import org.elasticsearch.search.builder.SearchSourceBuilder;
// ...
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));
SearchRequest searchRequest = new SearchRequest("video_passvehicle_push");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
// 添加过滤条件到查询条件构建器
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
if (StringUtils.isNotBlank(judgmentDTO.getGwdq())) {
String[] split = judgmentDTO.getGwdq().split(",");
for (int i = 0; i < split.length; i++) {
boolQueryBuilder.should(QueryBuilders.matchPhraseQuery("hphm", split[i]));
}
}
if (StringUtils.isNotBlank(judgmentDTO.getKssj())) {
boolQueryBuilder.filter(QueryBuilders.rangeQuery("gcsj").gte(judgmentDTO.getKssj() + " 00:00:00"));
}
if (StringUtils.isNotBlank(judgmentDTO.getJssj())) {
boolQueryBuilder.filter(QueryBuilders.rangeQuery("gcsj").lte(judgmentDTO.getJssj() + " 23:59:59"));
}
// 添加聚合到查询条件构建器
TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("sf").field("hphm.keyword");
termsAggregationBuilder.subAggregation(AggregationBuilders.filter("xxsl").filter(QueryBuilders.matchPhraseQuery("hpzl", "小型")));
termsAggregationBuilder.subAggregation(AggregationBuilders.filter("dxsl").filter(QueryBuilders.matchPhraseQuery("hpzl", "大型")));
searchSourceBuilder.query(boolQueryBuilder).aggregation(termsAggregationBuilder);
searchRequest.source(searchSourceBuilder);
// 执行查询请求
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
// 处理查询响应
Terms sfTerms = searchResponse.getAggregations().get("sf");
for (Terms.Bucket sfBucket : sfTerms.getBuckets()) {
String sf = sfBucket.getKeyAsString();
long xxsl = ((InternalFilter) sfBucket.getAggregations().get("xxsl")).getDocCount();
long dxsl = ((InternalFilter) sfBucket.getAggregations().get("dxsl")).getDocCount();
// 处理 sf, xxsl, dxsl
}
// 使用后关闭客户端
client.close();
说明:
- 使用
RestHighLevelClient连接 Elasticsearch 集群。 - 创建
SearchRequest对象,指定索引名称。 - 使用
SearchSourceBuilder创建查询条件,包括过滤条件和聚合条件。 - 使用
BoolQueryBuilder添加多个过滤条件,包括车牌号、开始时间和结束时间。 - 使用
TermsAggregationBuilder聚合车牌首字母,并添加子聚合统计小型车和大型车的数量。 - 使用
client.search()执行查询请求。 - 从查询响应中获取聚合结果,并处理数据。
- 使用
client.close()关闭客户端连接。
注意:
- 确保 Elasticsearch 集群已经启动并配置好。
- 索引名称
video_passvehicle_push需要替换成实际的索引名称。 - 字段名称
hphm、hpzl、gcsj需要替换成实际的字段名称。 - 车辆类型
小型和大型需要替换成实际的车辆类型。
本示例展示了一个基本的车辆统计查询操作,您可以根据实际需求调整查询条件和聚合方式。
原文地址: https://www.cveoy.top/t/topic/qlTd 著作权归作者所有。请勿转载和采集!