1 官方参考
官网文档参考地址: https://www.elastic.co/guide/index.html
注:我们一般使用Java REST Client,并且使用高级的。 https://www.elastic.co/guide/en/elasticsearch/client/java-rest/7.x/index.html
1.1 引入依赖
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.9.0</version>
</dependency>
1.2 初始化操作
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("localhost", 9200, "http"),
new HttpHost("localhost", 9201, "http")));
注:客户端用完后需要关闭客户端。
1.3 根据API使用客户端操作elasticsearch
2 搭建基础测试环境
2.1 创建springboot项目
<properties>
<java.version>1.8</java.version>
<!-- 自己定义的ES版本要和本地保持一致 -->
<elasticsearch.version>7.6.1</elasticsearch.version>
</properties>
<!-- 引入ES依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
注:spring-boot-starter-data-elasticsearch依赖实际是通过依赖spring-data-elasticsearch,而spring-data-elasticsearch最底层还是依赖org.elasticsearch.client和elasticsearch-rest-high-level-client两个版本的客户端来操作ES。
特别注意:项目中elasticsearch版本和使用的elasticsearch版本要一致,如果不一致则需要改成一致的。
2.2 配置注入ES
package com.example.config;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ElasticsearchClientConfig {
@Bean
public RestHighLevelClient restHighLevelClient(){
//如果是集群,则构建多个HttpHost对象
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("127.0.0.1", 9200, "http")));
return client;
}
}
注:这里我们不使用SpringBoot封装的ElasticsearchRestTemplate对象,若使用此对象需在application.yml中配置ES相关配置。
在spring-boot-autoconfigure的jar包中ES有两种类型的客户端配置属性参数,如上图所示。其中默认配置如下图所示
2.3 编写测试代码
package com.example;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.CreateIndexResponse;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.IOException;
@SpringBootTest
class ElasticsearchApiApplicationTests {
@Autowired
private RestHighLevelClient restHighLevelClient;
@Test
void testCreateIndex() throws IOException {
//1. 创建索引请求
CreateIndexRequest request = new CreateIndexRequest("test01");
//2. 客户端执行请求 IndicesClient,并获取响应信息
CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);
System.out.println("响应信息:" + createIndexResponse);
}
}
注:执行成功,索引创建成功,测试环境搭建成功!
3 客户端调用示例详解
3.1 索引API操作示例
3.1.1 创建索引
//1. 创建索引请求
CreateIndexRequest request = new CreateIndexRequest("test02");
//2. 客户端执行请求 IndicesClient,并获取响应信息
CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);
ObjectMapper objectMapper = new ObjectMapper();
//输出结果:{"acknowledged":true,"shardsAcknowledged":true,"fragment":false}
System.out.println(objectMapper.writeValueAsString(createIndexResponse));
3.1.2 获取索引
//1. 创建获取索引请求
GetIndexRequest getIndexRequest = new GetIndexRequest("test02");
//2. 判断索引是否存在
boolean exists = restHighLevelClient.indices().exists(getIndexRequest, RequestOptions.DEFAULT);
//输出结果:true
System.out.println(exists);
3.1.3 删除索引
//1. 创建删除索引请求
DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("test02");
//2. 执行删除操作,并返回删除结果
AcknowledgedResponse delete = restHighLevelClient.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
//输出结果:是否删除成功 true-成功
System.out.println(delete.isAcknowledged());
3.2 文档API操作示例
3.2.1 添加文档
//添加用户类
package com.example.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Component;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
public class User {
private String name;
private int age;
}
//测试
//1. 创建用户对象
User user = new User("张三",12);
//2. 创建索引请求
IndexRequest indexRequest = new IndexRequest("test01");
//3. 设置规则:PUT /test01/_doc/1)
indexRequest.id("1");//设置ID
indexRequest.timeout(TimeValue.timeValueSeconds(1));//设置过期时间1S
//4. 将数据放入请求,数据为JSON字符串
ObjectMapper objectMapper = new ObjectMapper();
indexRequest.source(objectMapper.writeValueAsString(user), XContentType.JSON);
//5. 客户端发送请求
IndexResponse indexResponse = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
System.out.println(indexResponse.status());//对应命令返回的状态(CREATED-创建)
System.out.println(indexResponse.toString());
3.2.2 获取文档
//1. 创建获取请求 GET /test01/_doc/1
GetRequest getRequest = new GetRequest("test01", "1");
//2. 设置不获取返回的_score的上下文,提高效率(非必需)
//getRequest.fetchSourceContext(new FetchSourceContext(false));
//3. 设置排序字段(非必需)
//getRequest.storedFields("_none_");
//4. 判断是否存在
boolean exists = restHighLevelClient.exists(getRequest, RequestOptions.DEFAULT);
System.out.println(exists);//true
//5. 获取文档内容信息
GetResponse getResponse = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT);
System.out.println(getResponse.getSourceAsString());//{"name":"张三","age":12}
3.2.3 更新文档
//1. 创建更新请求 PUT /test01/_doc/1
UpdateRequest updateRequest = new UpdateRequest("test01","1");
//2. 创建User对象数据
User user = new User("李四", 13);
ObjectMapper objectMapper = new ObjectMapper();
updateRequest.doc(objectMapper.writeValueAsString(user), XContentType.JSON);
//3. 执行变更,获取响应结果
UpdateResponse updateResponse = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
System.out.println(updateResponse.status());//OK-执行成功
3.2.4 删除文档
//1. 创建删除请求
DeleteRequest deleteRequest = new DeleteRequest("test01","1");
//2. 设置超时时间
deleteRequest.timeout("1s");
//3. 执行删除请求
DeleteResponse deleteResponse = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
System.out.println(deleteResponse.status());//OK-删除成功
3.2.5 批量插入文档数据
//1. 创建批量操作请求
BulkRequest bulkRequest = new BulkRequest();
//2. 创建批量操作数据
ArrayList<User> userList = new ArrayList<>();
userList.add(new User("ceshi1", 12));
userList.add(new User("ceshi2", 13));
userList.add(new User("ceshi3", 15));
userList.add(new User("ceshi4", 22));
//3. 设置批量操作
ObjectMapper objectMapper = new ObjectMapper();
for (int i = 0; i < userList.size(); i++) {
bulkRequest.add(
new IndexRequest("test01")
.id("" + (i + 1))
.source(objectMapper.writeValueAsString(userList.get(i)), XContentType.JSON)
);
}
//4. 执行请求
BulkResponse bulkResponse = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
System.out.println(bulkResponse.hasFailures());//false-是否失败,false表示执行成功
3.3 查询操作(*)
3.3.1 简单查询
//1. 创建查询请求
SearchRequest searchRequest = new SearchRequest("test01");
//2. 构建搜索条件构造器
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//3. 构建查询构造器,使用QueryBuilders能够快速匹配创建查询
//termQuery:精确匹配
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "ceshi1");
sourceBuilder.query(termQueryBuilder);
//4. 将搜索条件构造器放入请求
searchRequest.source(sourceBuilder);
//5. 查询数据
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
//通过getHits来获取查询结果数据
ObjectMapper objectMapper = new ObjectMapper();
System.out.println(objectMapper.writeValueAsString(searchResponse.getHits()));
3.3.2 分页查询
//1. 创建查询请求
SearchRequest searchRequest = new SearchRequest("test01");
//2. 构建搜索条件构造器
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//4. 添加分页参数,form表示从第几条数据开始,size表示查询多少条数据
sourceBuilder.from(0).size(2);
//4. 将搜索条件构造器放入请求
searchRequest.source(sourceBuilder);
//5. 查询数据
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
//通过getHits来获取查询结果数据
for (SearchHit searchHit : searchResponse.getHits().getHits()) {
System.out.println(searchHit.getSourceAsMap());
}
注:==sourceBuilder.from(0).size(2);==来实现分页查询。
3.3.3 高亮查询
SearchRequest searchRequest = new SearchRequest("test01");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//1. 设置高亮构造器
HighlightBuilder highlightBuilder = new HighlightBuilder();
//2. 标注哪些字段高亮
highlightBuilder.field("name");
//3. 设置高亮开始标签
highlightBuilder.preTags("<span style='color:red;'>");
//4. 设置高亮结束标签
highlightBuilder.postTags("</span>");
sourceBuilder.highlighter(highlightBuilder);
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("name", "李");
sourceBuilder.query(matchQueryBuilder);
searchRequest.source(sourceBuilder);
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
for(SearchHit searchHit: searchResponse.getHits()) {
Map<String, HighlightField> highlightFields = searchHit.getHighlightFields();
HighlightField highlightField = highlightFields.get("name");
System.out.println(highlightField.getFragments()[0].toString());
}