es 的 HighLevelClient存在es源代码的引用,结合springboot使用时,会存在es版本的冲突,这里记录下解决冲突和使用方式(es已经不建议使用这个了)。
注意es服务端的版本需要与client的版本对齐,否则返回数据可能会解析失败!!!
文档地址:Java High Level REST Client | Java REST Client [7.17] | Elastic
1、首先创建个java springboot项目
源码地址:https://github.com/a66245753/es-7-high-level-client.git
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
2.2 es 多个id查询数据
/**
* ids查询
*
* @return
* @throws IOException
*/
@PostMapping("/getBatch")
public ResponseEntity
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
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的版本冲突,这点解决掉就可以了,官方文档里都能找到使用说明