目录

Elasticsearch-Java-High-Level-Client-7.17-使用

目录

Elasticsearch Java High Level Client [7.17] 使用

es 的 HighLevelClient存在es源代码的引用,结合springboot使用时,会存在es版本的冲突,这里记录下解决冲突和使用方式(es已经不建议使用这个了)。 注意es服务端的版本需要与client的版本对齐,否则返回数据可能会解析失败!!! 文档地址: 1、首先创建个java springboot项目 源码地址: pom依赖文件如下,在 dependencyManagement 里解决springboot引起的版本冲突- 4.0.0

org.springframework.boot spring-boot-starter-parent 2.6.4

com.david es-7-high-level-client 1.0-SNAPSHOT jar es-7-high-level-client

UTF-8 7.17.28

org.elasticsearch.client elasticsearch-rest-client ${elastic.version}

org.elasticsearch.client elasticsearch-rest-high-level-client ${elastic.version}

org.elasticsearch elasticsearch ${elastic.version}

org.springframework.boot spring-boot-starter-web

org.springframework.boot spring-boot-starter-actuator

org.elasticsearch.client elasticsearch-rest-high-level-client

com.baomidou mybatis-plus-boot-starter 3.4.1

mysql mysql-connector-java runtime

org.projectlombok lombok 1.18.22 provided 2、配置es client为java bean @Configuration public class EsClientConfig { @Bean public RestHighLevelClient restHighLevelClient() { return new RestHighLevelClient( RestClient.builder( new HttpHost(“localhost”, 9200, “http”) ) ); } } 2.1 es id查询数据 /**

  • id查询
  • @return
  • @throws IOException / @PostMapping("/get") public ResponseEntity get() throws IOException { GetRequest getRequest = new GetRequest(“ssp_ad_union_log_202403”); getRequest.id(“fcBZZZUBJ3krEJ13KbOG”); GetResponse response = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT); return new ResponseEntity<>(response.getSourceAsMap(), HttpStatus.OK); } 2.2 es 多个id查询数据 /*
  • ids查询
  • @return
  • @throws IOException / @PostMapping("/getBatch") public ResponseEntity getBatch() throws IOException { MultiGetRequest multiGetRequest = new MultiGetRequest(); multiGetRequest.add(“ssp_ad_union_log_202403”,“fcBZZZUBJ3krEJ13KbOG”); multiGetRequest.add(“ssp_ad_union_log_202403”,“VsBZZZUBJ3krEJ13KbOG”); MultiGetResponse multiGetItemResponses = restHighLevelClient.multiGet(multiGetRequest, RequestOptions.DEFAULT); return new ResponseEntity<>(multiGetItemResponses.getResponses(), HttpStatus.OK); } 2.3 search 分页 /*
  • 分页查询
  • @param request
  • @return
  • @throws IOException / @PostMapping("/search") public ResponseEntity search(@RequestBody EsSearchRequest request) throws IOException { SearchRequest searchRequest = new SearchRequest(request.getIndex()); // 构建搜索请求 SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.trackTotalHits(true); sourceBuilder.from((request.getPageIndex() - 1) * request.getPageSize()); sourceBuilder.size(request.getPageSize()); searchRequest.source(sourceBuilder); BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery(); if (request.getEqualsParams() != null && !request.getEqualsParams().isEmpty()) { for (Map.Entry entry : request.getEqualsParams().entrySet()) { queryBuilder.filter(QueryBuilders.termQuery(entry.getKey(), entry.getValue())); } } if (request.getLikeParams() != null && !request.getLikeParams().isEmpty()) { for (Map.Entry entry : request.getLikeParams().entrySet()) { queryBuilder.must(QueryBuilders.matchQuery(entry.getKey(), entry.getValue())); } } if (request.getRangeParams() != null && !request.getRangeParams().isEmpty()) { for (EsRangeParams rangeParam : request.getRangeParams()) { RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery(rangeParam.getField()); if (rangeParam.getGte() != null) { rangeQuery.gte(rangeParam.getGte()); } if (rangeParam.getLte() != null) { rangeQuery.lte(rangeParam.getLte()); } queryBuilder.filter(rangeQuery); } } sourceBuilder.query(queryBuilder); // 打印查询语句,可以放到kibana中执行并分析性能 System.out.println(searchRequest.source().toString()); // 执行搜索 SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); EsSearchResult result = new EsSearchResult(); result.setPageIndex(request.getPageIndex()); result.setPageSize(request.getPageSize()); result.setTotal(searchResponse.getHits().getTotalHits().value); result.setList(Arrays.stream(searchResponse.getHits().getHits()).map(SearchHit::getSourceAsMap).collect(Collectors.toList())); return new ResponseEntity<>(result, HttpStatus.OK); } 2.4 aggs 聚合统计 /*
  • 聚合统计
  • @param request
  • @return
  • @throws IOException / @PostMapping("/aggs") public ResponseEntity> aggs(@RequestBody EsSearchRequest request) throws IOException { // 创建 SearchSourceBuilder 实例 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); // 设置 track_total_hits searchSourceBuilder.trackTotalHits(true); // 设置分页参数 searchSourceBuilder.from(0); searchSourceBuilder.size(1); // 构建 bool 查询 BoolQueryBuilder boolQuery = QueryBuilders.boolQuery() .filter(QueryBuilders.termQuery(“provinceName”, “浙江”)); // 添加查询到 SearchSourceBuilder searchSourceBuilder.query(boolQuery); // 构建聚合 TermsAggregationBuilder cityGroup = AggregationBuilders.terms(“city_group”) .field(“cityName”).size(10) .subAggregation(AggregationBuilders.terms(“network_group”).field(“network”).size(10)) .subAggregation(AggregationBuilders.terms(“phoneBrand_group”).field(“phoneBrandName”).size(10)) .subAggregation(AggregationBuilders.terms(“sdkVersion_group”).field(“sdkVersion”).size(10)) .subAggregation(AggregationBuilders.terms(“platform_group”).field(“platformName”).size(10)) .subAggregation(AggregationBuilders.terms(“req_group”).field(“bizType”).size(10)) .subAggregation( AggregationBuilders.filter(“ecpm_group”, QueryBuilders.termQuery(“bizType”, 2)) .subAggregation(AggregationBuilders.avg(“avg_ecpm”).field(“ecpm”)) ); // 添加聚合到 SearchSourceBuilder searchSourceBuilder.aggregation(cityGroup); // 创建 SearchRequest 并指定索引名称 SearchRequest searchRequest = new SearchRequest(“ssp_ad_union_log_202403”); searchRequest.source(searchSourceBuilder); // 执行搜索请求 SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); List result = new ArrayList<>(searchResponse.getAggregations().asList()); for (Aggregation aggregation : searchResponse.getAggregations().asList()) { String json = aggregation.toString(); // String json = OBJECT_MAPPER.writeValueAsString(aggregation); // Map map = new HashMap<>(); // BeanUtils.copyProperties(aggregation, map); result.add(json); } return new ResponseEntity<>(result, HttpStatus.OK); } 2.5 新增单条数据 /*
  • 通过json新增
  • @return
  • @throws IOException */ @RequestMapping(path = “add”) public ResponseEntity add() throws IOException { IndexRequest indexRequest = new IndexRequest(“ssp_ad_union_log_202403”); // indexRequest.id(“1234567890”); indexRequest.opType(DocWriteRequest.OpType.CREATE); indexRequest.source("{\n" + " "id": 27731976,\n" + " "reqId": "d63e0377-639a-4ac4-96a7-677d507e627e",\n" + " "device": "android",\n" + " "platform": 3,\n" + " "platformName": "快手",\n" + " "clientType": 1,\n" + " "myAppId": "300001",\n" + " "deviceId": "d63e0377-639a-4ac4-96a7-677d507e627e",\n" + " "adSiteGroupId": 100000055,\n" + " "adSiteId": "6827003034",\n" + " "packagePath": "com.jihuomiao.app",\n" + " "ecpm": 10700,\n" + " "location": null,\n" + " "ip": null,\n" + " "cityId": 422800,\n" + " "areaId": 422822,\n" + " "cityName": "恩施",\n" + " "areaName": "建始",\n" + " "provinceId": 420000,\n" + " "provinceName": "湖北",\n" + " "phoneBrand": "OPPO",\n" + " "phoneBrandName": "oppo",\n" + " "phoneModel": null,\n" + " "idfa": null,\n" + " "bizType": 1,\n" + " "sdkVersion": "1.0.2",\n" + " "network": "5g",\n" + " "logTime": "2025-03-03 15:31:10",\n" + " "createdAt": "2025-03-03 15:31:10"\n" + " }", XContentType.JSON); IndexResponse indexResponse = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT); return new ResponseEntity<>(indexResponse, HttpStatus.OK); } 2.6 bulk 批量新增数据 @RequestMapping(path = “addBatch”) public ResponseEntity addBatch() throws IOException { // 创建 BulkRequest BulkRequest bulkRequest = new BulkRequest(); // 添加多个 bulkRequest.add(new IndexRequest(“ssp_ad_union_log_202403”) // .id(“12345678909”) .source("{ "field1": "value1", "field2": "value2" }", XContentType.JSON)); bulkRequest.add(new IndexRequest(“my_index”) // .id(“12345678987654”) .source("{ "field1": "value2", "field2": "value2" }", XContentType.JSON)); // 执行批量创建操作 BulkResponse bulkResponse = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT); // 检查是否有错误 if (bulkResponse.hasFailures()) { System.err.println(“Bulk operation had failures: " + bulkResponse.buildFailureMessage()); } else { System.out.println(“All documents created successfully.”); } return new ResponseEntity<>(bulkResponse, HttpStatus.OK); } es 7 high Level client 主要的集成问题还是在与springboot的版本冲突,这点解决掉就可以了,官方文档里都能找到使用说明