springboot整个es有四种方法,分别是TransportClient、RestClient、SpringData-Es、Elasticsearch-SQL。
官方推荐的是RestClient
1 引入依赖
创建SpringBoot工程,引入依赖,在spring-boot-dependencies中所依赖的ES版本位可能不一致,要改掉
<!-- 将依赖版本号改成对应版本 7.4.2 -->
<properties>
<java.version>1.8</java.version>
<elasticsearch.version>7.4.2</elasticsearch.version>
</properties>
<!-- Java High Level REST Client -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>${elasticsearch.version}</version>
</dependency>
2 编写配置类
@Configuration
public class RestClientConfig {
@Bean
public RestHighLevelClient restHighLevelClient() {
// 如果有多个从节点可以持续在内部new多个HttpHost,参数1是IP,参数2是端口,参数3是通信协议
return new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));
}
}
3 测试
1.1 添加文档
@Test
public void indexData() throws IOException {
// IndexRequest
IndexRequest indexRequest = new IndexRequest("users");
User user = new User();
user.setUserName("张三");
user.setAge(20);
user.setGender("男");
String source = JSON.toJSONString(user);
indexRequest.id("1").source(source, XContentType.JSON);
// 操作ES
IndexResponse indexResponse = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
System.out.println(indexResponse);
}
1.2 修改文档
@Test
public void updateData() throws IOException {
// UpdateRequest
UpdateRequest updateRequest = new UpdateRequest("users", "1");
User user = new User();
user.setUserName("李四");
user.setAge(20);
user.setGender("女");
updateRequest.doc(JSON.toJSONString(user), XContentType.JSON);
// 操作ES
restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
}
1.3 删除文档
@Test
public void delete() throws IOException {
// DeleteRequest
DeleteRequest deleteRequest = new DeleteRequest("users", "1");
// 操作ES
DeleteResponse deleteResponse = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
}
1.4 查询文档
@Test
public void search() throws IOException {
// SearchRequest
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices("users");
// 构建检索条件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
// 分页采用简单的from + size分页,适用数据量小的,了解更多分页方式可自行查阅资料
// searchSourceBuilder.from((page - 1) * rows);
// searchSourceBuilder.size(rows);
// 查询所有
// QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
// 根据字段匹配
QueryBuilder queryBuilder = QueryBuilders.matchQuery("userName","李四");
searchSourceBuilder.query(queryBuilder);
searchRequest.source(searchSourceBuilder);
// 查询ES
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
System.out.println("查询结果:" + searchResponse.toString());
SearchHits hits = searchResponse.getHits();
// 遍历封装列表对象
List<User> userList = new ArrayList<>();
SearchHit[] searchHits = hits.getHits();
for (SearchHit searchHit : searchHits) {
userList.add(JSON.parseObject(searchHit.getSourceAsString(), User.class));
}
System.out.println(userList);
}
搜索address中包含mill的所有人的年龄分布以及平均年龄,平均薪资
GET bank/_search
{
"query": {
"match": {
"address": "Mill"
}
},
"aggs": {
"ageAgg": {
"terms": {
"field": "age",
"size": 10
}
},
"ageAvg": {
"avg": {
"field": "age"
}
},
"balanceAvg": {
"avg": {
"field": "balance"
}
}
}
}
代码实现
@Test
public void find() throws IOException {
// 1 创建检索请求
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices("bank");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 构造检索条件
sourceBuilder.query(QueryBuilders.matchQuery("address","mill"));
//AggregationBuilders工具类构建AggregationBuilder
// 构建第一个聚合条件:按照年龄的值分布
TermsAggregationBuilder agg1 = AggregationBuilders.terms("agg1").field("age").size(10);// 聚合名称
// 参数为AggregationBuilder
sourceBuilder.aggregation(agg1);
// 构建第二个聚合条件:平均薪资
AvgAggregationBuilder agg2 = AggregationBuilders.avg("agg2").field("balance");
sourceBuilder.aggregation(agg2);
System.out.println("检索条件"+sourceBuilder.toString());
searchRequest.source(sourceBuilder);
// 2 执行检索
SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
// 3 分析响应结果
System.out.println(response.toString());
}