本示例展示如何使用 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 需要替换成实际的索引名称。
  • 字段名称 hphmhpzlgcsj 需要替换成实际的字段名称。
  • 车辆类型 小型大型 需要替换成实际的车辆类型。

本示例展示了一个基本的车辆统计查询操作,您可以根据实际需求调整查询条件和聚合方式。

使用 Elasticsearch RestHighLevelClient 查询车辆统计信息

原文地址: https://www.cveoy.top/t/topic/qlTd 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录