1. 文档
官方文档:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/7.6/_index_apis.html 找和自己版本、语言相对应的文档



Java REST Client 有两种风格:
Java Low Level REST Client :用于Elasticsearch的官方低级客户端。它允许通过http与Elasticsearch集群通信。将请求编排和响应反编排留给用户自己处理。它兼容所有的Elasticsearch版本。(PS:学过WebService的话,对编排与反编排这个概念应该不陌生。可以理解为对请求参数的封装,以及对响应结果的解析)
Java High Level REST Client :用于Elasticsearch的官方高级客户端。它是基于低级客户端的,它提供很多API,并负责请求的编排与响应的反编排。(PS:就好比是,一个是传自己拼接好的字符串,并且自己解析返回的结果;而另一个是传对象,返回的结果也已经封装好了,直接是对象,更加规范了参数的名称以及格式,更加面对对象一点)
Tip:我们使用 High Level REST Client
2. 使用步骤
2.1 创建 springboot 项目
2.2 配置依赖(改pom)
<properties><java.version>1.8</java.version><!-- 这里SpringBoot默认配置的版本和使用的es不匹配,我们需要自己配置版本! --><elasticsearch.version>7.6.1</elasticsearch.version></properties><!-- 这里的依赖可用去maven仓库寻找 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency>
2.3 自定义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;@Configurationpublic class EsConfig {@BeanRestHighLevelClient restHighLevelClient() {return new RestHighLevelClient(// 配置ip和端口RestClient.builder(new HttpHost("localhost", 9201, "http"), // 构建客户端对象new HttpHost("localhost", 9200)));}}
2.4 测试代码
package com.edward;import com.alibaba.fastjson.JSON;import com.edward.entity.User;import lombok.extern.slf4j.Slf4j;import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;import org.elasticsearch.action.bulk.BulkRequest;import org.elasticsearch.action.bulk.BulkResponse;import org.elasticsearch.action.delete.DeleteRequest;import org.elasticsearch.action.delete.DeleteResponse;import org.elasticsearch.action.get.GetRequest;import org.elasticsearch.action.get.GetResponse;import org.elasticsearch.action.index.IndexRequest;import org.elasticsearch.action.index.IndexResponse;import org.elasticsearch.action.search.SearchRequest;import org.elasticsearch.action.search.SearchResponse;import org.elasticsearch.action.support.master.AcknowledgedResponse;import org.elasticsearch.action.update.UpdateRequest;import org.elasticsearch.action.update.UpdateResponse;import org.elasticsearch.client.RequestOptions;import org.elasticsearch.client.RestHighLevelClient;import org.elasticsearch.client.indices.CreateIndexRequest;import org.elasticsearch.client.indices.CreateIndexResponse;import org.elasticsearch.client.indices.GetIndexRequest;import org.elasticsearch.client.indices.GetIndexResponse;import org.elasticsearch.common.xcontent.XContentType;import org.elasticsearch.index.query.QueryBuilder;import org.elasticsearch.index.query.QueryBuilders;import org.elasticsearch.rest.RestStatus;import org.elasticsearch.search.SearchHit;import org.elasticsearch.search.builder.SearchSourceBuilder;import org.elasticsearch.search.fetch.subphase.FetchSourceContext;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.boot.test.context.SpringBootTest;import java.io.IOException;import java.util.ArrayList;@Slf4j@SpringBootTestclass EsDemoApplicationTests {@Autowiredprivate RestHighLevelClient restHighLevelClient;/**-------------------------索引--------------------------* 创建索引* */@Testvoid testCreateIndices() throws IOException {CreateIndexRequest request = new CreateIndexRequest("es_index_demo");CreateIndexResponse response = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);log.info("create index result:{}", response.isAcknowledged()); // true(成功) | 失败抛异常}/** 测试索引是否存在* */@Testvoid testExistIndices() throws IOException {GetIndexRequest request = new GetIndexRequest("es_index_demo");boolean exists = restHighLevelClient.indices().exists(request, RequestOptions.DEFAULT);log.info("res:{}", exists); // true(存在) | false(不存在)}/** 测试删除索引* */@Testvoid testDeleteIndices() throws IOException {DeleteIndexRequest request = new DeleteIndexRequest("es_index_demo");AcknowledgedResponse response = restHighLevelClient.indices().delete(request, RequestOptions.DEFAULT);log.info("deleteRes:{}", response.isAcknowledged()); // true(删除成功,若无这个索引也返回true)}/**-------------------------文档--------------------------* 测试添加文档* */@Testvoid testAddDocument() throws IOException {User user = User.builder().name("大龙").age(20).build();IndexRequest request = new IndexRequest("es_index_demo").id("1") // id 不指定则生成随机字符串.source(JSON.toJSONString(user), XContentType.JSON);// 发送请求IndexResponse response = restHighLevelClient.index(request, RequestOptions.DEFAULT);log.info("status:{}",response.status()); // CREATED(没这条文档,初次创建) | OK(更新)log.info("getResult:{}",response.getResult()); // CREATED(没这条文档,初次创建) | UPDATED(更新)}/** 测试文档是否存在(根据索引和文档id判断)* */@Testvoid testExistDocument() throws IOException {GetRequest request = new GetRequest("es_index_demo","1");// 不获取 _source 上下文request.fetchSourceContext(new FetchSourceContext(false));// 不获取 stored fieldsrequest.storedFields("_none_");// 判断是否存在boolean exists = restHighLevelClient.exists(request, RequestOptions.DEFAULT);log.info("exist:{}", exists); // true(存在) | false(不存在)}/** 测试更新某个文档(根据文档id)* */@Testvoid testUpdateDocument() throws IOException {User user = User.builder().name("小龙").age(1).build();// 构建请求信息UpdateRequest request = new UpdateRequest("es_index_demo", "1");request.doc(JSON.toJSONString(user), XContentType.JSON);// 发送更新请求UpdateResponse response = restHighLevelClient.update(request, RequestOptions.DEFAULT);log.info("res:{}", response);log.info("res - status:{}", response.status()); // OK(成功)}/** 测试删除某个文档(根据文档id)* */@Testvoid testDeleteDocument() throws IOException {DeleteRequest request = new DeleteRequest("es_index_demo", "1");DeleteResponse response = restHighLevelClient.delete(request, RequestOptions.DEFAULT);log.info("response:{}",response.status()); // OK(删除成功) | NOT_FOUND(未找到)log.info("RestStatus.OK,{}", RestStatus.OK); // OK}/** 测试根据索引和文档id获取文档信息* */@Testvoid testGetDocument() throws IOException {GetRequest request = new GetRequest("es_index_demo", "1");GetResponse response = restHighLevelClient.get(request, RequestOptions.DEFAULT);log.info("result_source_String:{}",response.getSourceAsString()); // 获取 _source 的内容并转为字符串 | 没数据返回nulllog.info("result_source_Map:{}",response.getSourceAsMap()); // 获取 _source 的内容并转为map | 没数据返回 null}/** 批量添加文档* */@Testvoid testBulkDocument() throws IOException {ArrayList<User> userList = new ArrayList<>();userList.add(new User("edward1",3));userList.add(new User("edward2",3));userList.add(new User("edward3",3));userList.add(new User("damon1",3));userList.add(new User("damon2",3));userList.add(new User("damon3",3));// 构建请求数据BulkRequest bulkRequest = new BulkRequest();for (User user : userList) {bulkRequest.add(new IndexRequest("es_index_demo").source(JSON.toJSONString(user), XContentType.JSON));}// 发送请求BulkResponse response = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);log.info("response-status,{}", response.status()); // OKlog.info("response-hasFailures,{}", response.hasFailures()); // false}/** 查询测试* */@Testvoid testSearch() throws IOException {SearchRequest request = new SearchRequest("es_index_demo");// 构件查询信息SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.query(QueryBuilders.matchQuery("name", "edward1"));// 将查询信息放入 request 中request.source(searchSourceBuilder);// 发送请求SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);log.info("res_hits:{}",response.getHits());// 遍历结果集for (SearchHit hit : response.getHits().getHits()) {log.info("hit:{}",hit.getSourceAsMap()); // {name=edward1, age=3}}}}
3. es 工具类封装
import com.alibaba.fastjson.JSON;import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;import org.elasticsearch.action.bulk.BulkRequest;import org.elasticsearch.action.bulk.BulkResponse;import org.elasticsearch.action.delete.DeleteRequest;import org.elasticsearch.action.delete.DeleteResponse;import org.elasticsearch.action.get.GetRequest;import org.elasticsearch.action.get.GetResponse;import org.elasticsearch.action.index.IndexRequest;import org.elasticsearch.action.index.IndexResponse;import org.elasticsearch.action.search.SearchRequest;import org.elasticsearch.action.search.SearchResponse;import org.elasticsearch.action.support.master.AcknowledgedResponse;import org.elasticsearch.action.update.UpdateRequest;import org.elasticsearch.action.update.UpdateResponse;import org.elasticsearch.client.RequestOptions;import org.elasticsearch.client.RestHighLevelClient;import org.elasticsearch.client.indices.CreateIndexRequest;import org.elasticsearch.client.indices.CreateIndexResponse;import org.elasticsearch.client.indices.GetIndexRequest;import org.elasticsearch.common.unit.TimeValue;import org.elasticsearch.common.xcontent.XContentType;import org.elasticsearch.index.query.QueryBuilders;import org.elasticsearch.rest.RestStatus;import org.elasticsearch.search.builder.SearchSourceBuilder;import org.elasticsearch.search.fetch.subphase.FetchSourceContext;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.stereotype.Component;import java.io.IOException;import java.util.List;import java.util.concurrent.TimeUnit;@Componentpublic class EsUtils<T> {@Autowired@Qualifier("restHighLevelClient")private RestHighLevelClient client;/*** 判断索引是否存在* @param index* @return* @throws IOException*/public boolean existsIndex(String index) throws IOException {GetIndexRequest request = new GetIndexRequest(index);boolean exists = client.indices().exists(request,RequestOptions.DEFAULT);return exists;}/*** 创建索引* @param index* @throws IOException*/public boolean createIndex(String index) throws IOException {CreateIndexRequest request = new CreateIndexRequest(index);CreateIndexResponse createIndexResponse=client.indices().create(request,RequestOptions.DEFAULT);return createIndexResponse.isAcknowledged();}/*** 删除索引* @param index* @return* @throws IOException*/public boolean deleteIndex(String index) throws IOException {DeleteIndexRequest deleteIndexRequest = newDeleteIndexRequest(index);AcknowledgedResponse response =client.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);return response.isAcknowledged();}/*** 判断某索引下文档id是否存在* @param index* @param id* @return* @throws IOException*/public boolean docExists(String index, String id) throws IOException {GetRequest getRequest = new GetRequest(index,id);// 只判断索引是否存在不需要获取_sourcegetRequest.fetchSourceContext(new FetchSourceContext(false));getRequest.storedFields("_none_");boolean exists = client.exists(getRequest, RequestOptions.DEFAULT);return exists;}/*** 添加文档记录* @param index* @param id* @param t 要添加的数据实体类* @return* @throws IOException*/public boolean addDoc(String index,String id,T t) throws IOException {IndexRequest request = new IndexRequest(index);request.id(id);//timeoutrequest.timeout(TimeValue.timeValueSeconds(1));request.timeout("1s");request.source(JSON.toJSONString(t), XContentType.JSON);IndexResponse indexResponse = client.index(request,RequestOptions.DEFAULT);RestStatus Status = indexResponse.status();return Status==RestStatus.OK||Status== RestStatus.CREATED;}/*** 根据id来获取记录* @param index* @param id* @return* @throws IOException*/public GetResponse getDoc(String index, String id) throws IOException {GetRequest request = new GetRequest(index,id);GetResponse getResponse = client.get(request,RequestOptions.DEFAULT);return getResponse;}/*** 批量添加文档记录* 没有设置id ES会自动生成一个,如果要设置 IndexRequest的对象.id()即可* @param index* @param list* @return* @throws IOException*/public boolean bulkAdd(String index, List<T> list) throws IOException {BulkRequest bulkRequest = new BulkRequest();//timeoutbulkRequest.timeout(TimeValue.timeValueMinutes(2));bulkRequest.timeout("2m");for (int i =0;i<list.size();i++){bulkRequest.add(new IndexRequest(index).source(JSON.toJSONString(list.get(i))));}BulkResponse bulkResponse = client.bulk(bulkRequest,RequestOptions.DEFAULT);return !bulkResponse.hasFailures();}/*** 批量删除和更新就不写了可根据上面几个方法来写*//*** 更新文档记录* @param index* @param id* @param t* @return* @throws IOException*/public boolean updateDoc(String index,String id,T t) throws IOException{UpdateRequest request = new UpdateRequest(index,id);request.doc(JSON.toJSONString(t));request.timeout(TimeValue.timeValueSeconds(1));request.timeout("1s");UpdateResponse updateResponse = client.update(request, RequestOptions.DEFAULT);return updateResponse.status()==RestStatus.OK;}/*** 删除文档记录* @param index* @param id* @return* @throws IOException*/public boolean deleteDoc(String index,String id) throws IOException {DeleteRequest request = new DeleteRequest(index,id);//timeoutrequest.timeout(TimeValue.timeValueSeconds(1));request.timeout("1s");DeleteResponse deleteResponse = client.delete(request, RequestOptions.DEFAULT);return deleteResponse.status()== RestStatus.OK;}/*** 根据某字段来搜索* @param index* @param field* @param key 要收搜的关键字* @throws IOException*/public void search(String index,String field ,String key,Integer from,Integer size) throws IOException {SearchRequest searchRequest = new SearchRequest(index);SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();sourceBuilder.query(QueryBuilders.termQuery(field, key));//控制搜素sourceBuilder.from(from);sourceBuilder.size(size);//最大搜索时间。sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));searchRequest.source(sourceBuilder);SearchResponse searchResponse = client.search(searchRequest,RequestOptions.DEFAULT);System.out.println(JSON.toJSONString(searchResponse.getHits()));}}
