SpringBoot初始化的项目默认的es版本和本地使用es的版本不一致是,可自定义es版本依赖,保证和本地的一致。
Mave配置
高级 Java REST 客户端托管在 Maven Central 上。所需的最低 Java 版本是1.8。
在SpringBoot的pom.xml文件中,添加Elasticsearch客户端依赖,这里推荐使用高级 Java REST 客户端依,详见:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/index.html
<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.14.0</version></dependency>
高级 Java REST 客户端依赖于以下工件及其传递依赖项:
- org.elasticsearch.client:elasticsearch-rest-client
- org.elasticsearch:elasticsearch
添加阿里的fastjson依赖,用来序列化json对象:
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.78</version></dependency>
初始化
一个RestHighLevelClient实例需要一个REST low-level client builder(REST 低级客户端构建器)来构建,如下所示:
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http"),new HttpHost("localhost", 9201, "http")));
高级客户端将在内部创建基于构建器创建一个提供执行请求的低级客户端。那个低级客户端维护一个连接池并启动一些线程,所以当你真正完成它时你应该关闭高级客户端,它会反过来关闭内部低级客户端以释放这些资源。可以通过实例的close方法,关闭连接并释放资源:
client.close();
SpringBoot配置
package com.es.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 // 相当于spring xml配置public class ElasticSearchClientConfig {// 相当于spring <beans id="restHighLevelClient" class="RestHighLevelClient />@Beanpublic RestHighLevelClient restHighLevelClient() {RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));return client;}}
API
Document APIS-文档Api
package com.es;import com.alibaba.fastjson.JSON;import com.es.pojo.User;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.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.settings.Settings;import org.elasticsearch.common.xcontent.XContentType;import org.elasticsearch.core.TimeValue;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;import java.util.HashMap;import java.util.Map;@SpringBootTestclass EsApiApplicationTests {@Autowired@Qualifier("restHighLevelClient")private RestHighLevelClient client;// 测试索引的创建@Testvoid testCreateIndex() throws IOException {// 1、创建索引请求CreateIndexRequest request = new CreateIndexRequest("test_es_index");// 设置索引设置 Index settingsrequest.settings(Settings.builder().put("index.number_of_shards", 3).put("index.number_of_replicas", 2));// 设置索引类型 Index mappingsMap<String, Object> textType = new HashMap<>();textType.put("type", "text");Map<String, Object> keywordType = new HashMap<>();keywordType.put("type", "keyword");Map<String, Object> integerType = new HashMap<>();integerType.put("type", "integer");Map<String, Object> properties = new HashMap<>();properties.put("name", textType);properties.put("email", keywordType);properties.put("age", integerType);Map<String, Object> mapping = new HashMap<>();mapping.put("properties", properties);request.mapping(mapping);// 2、客户端执行请求,请求后获取响应CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);System.out.println(createIndexResponse);}// 测试判断索引是否创建@Testvoid testExitIndex() throws IOException {GetIndexRequest request = new GetIndexRequest("test_es_index");boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);System.out.println(exists);}// 测试获取索引@Testvoid testGetIndex() throws IOException {GetIndexRequest request = new GetIndexRequest("test_es_index");GetIndexResponse getIndexResponse = client.indices().get(request, RequestOptions.DEFAULT);System.out.println(getIndexResponse.getSettings());}// 测试删除索引@Testvoid testDeleteIndex() throws IOException {DeleteIndexRequest request = new DeleteIndexRequest("test_es_index");AcknowledgedResponse delete = client.indices().delete(request, RequestOptions.DEFAULT);System.out.println(delete.isAcknowledged());}// 测试添加文档@Testvoid testAddDocument() throws IOException {// 创建对象User user = new User("张三", 18, "zhangsan@email.com");// 创建请求IndexRequest request = new IndexRequest("test_es_index");request.id("1");request.timeout(TimeValue.timeValueSeconds(5));// 将json数据放入请求request.source(JSON.toJSONString(user), XContentType.JSON);// 客户端发送请求,获取响应的结果IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT);System.out.println(indexResponse.toString());System.out.println(indexResponse.status());}// 测试获取文档,判断是否存在 GET index/type/id@Testvoid testExitDocument() throws IOException {GetRequest getRequest = new GetRequest("test_es_index", "1");// 不获取返回的 _source 的上下文,提高执行速度getRequest.fetchSourceContext(new FetchSourceContext(false));boolean exists = client.exists(getRequest, RequestOptions.DEFAULT);System.out.println(exists);}// 测试获取文档信息@Testvoid testGetDocument() throws IOException {GetRequest getRequest = new GetRequest("test_es_index", "1");GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);System.out.println(getResponse.getSourceAsString()); // 打印文档内容,{"age":18,"name":"张三"}System.out.println(getResponse); // 返回的全部内容和使用es命令获取是一样的,{"_index":"test_es_index","_type":"_doc","_id":"1","_version":1,"_seq_no":0,"_primary_term":1,"found":true,"_source":{"age":18,"name":"张三"}}}// 测试更新文档信息@Testvoid testUpdateDocument() throws IOException {UpdateRequest updateRequest = new UpdateRequest("test_es_index", "1");updateRequest.timeout("5s");User user = new User("李四", 25, "lisi@email.com");updateRequest.doc(JSON.toJSONString(user), XContentType.JSON);UpdateResponse updateResponse = client.update(updateRequest, RequestOptions.DEFAULT);System.out.println(updateResponse.status());System.out.println(updateResponse);}// 测试删除文档@Testvoid testDeleteDocument() throws IOException {DeleteRequest deleteRequest = new DeleteRequest("test_es_index", "1");deleteRequest.timeout("5s");DeleteResponse deleteResponse = client.delete(deleteRequest, RequestOptions.DEFAULT);System.out.println(deleteResponse.status());System.out.println(deleteResponse);}// 批量导入文档@Testvoid testBulkRequest() throws IOException {BulkRequest bulkRequest = new BulkRequest();bulkRequest.timeout("60s");ArrayList<User> userArrayList = new ArrayList<>();userArrayList.add(new User("User1", 6, "user1@email.com"));userArrayList.add(new User("User2", 18, "user2@email.com"));userArrayList.add(new User("User22", 18, "user22@email.com"));userArrayList.add(new User("User3", 32, "user3@email.com"));userArrayList.add(new User("User4", 18, "user4@email.com"));userArrayList.add(new User("User5", 50, "user5@email.com"));// 批处理请求for (int i = 0; i < userArrayList.size(); i++) {bulkRequest.add(new IndexRequest("test_es_index").id("" + (i + 1)).source(JSON.toJSONString(userArrayList.get(i)), XContentType.JSON));}BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);System.out.println(bulkResponse.status());System.out.println(bulkResponse.hasFailures());System.out.println(bulkResponse);}}
Search APIS-查询Api
https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/_search_apis.html
package com.es;import com.alibaba.fastjson.JSON;import org.elasticsearch.action.search.SearchRequest;import org.elasticsearch.action.search.SearchResponse;import org.elasticsearch.client.RequestOptions;import org.elasticsearch.client.RestHighLevelClient;import org.elasticsearch.core.TimeValue;import org.elasticsearch.index.query.MatchAllQueryBuilder;import org.elasticsearch.index.query.MatchQueryBuilder;import org.elasticsearch.index.query.QueryBuilders;import org.elasticsearch.index.query.TermQueryBuilder;import org.elasticsearch.search.SearchHit;import org.elasticsearch.search.builder.SearchSourceBuilder;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.concurrent.TimeUnit;@SpringBootTestpublic class EsSearchApiTests {@Autowired@Qualifier("restHighLevelClient")private RestHighLevelClient client;// 查询-精确查询@Testvoid testTermQuery() throws IOException {SearchRequest searchRequest = new SearchRequest("test_es_index");// 构造搜索条件SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();// 查询条件,可以使用 QueryBuilders 工具来实现TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("age", "18");sourceBuilder.query(termQueryBuilder);searchRequest.source(sourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);System.out.println(JSON.toJSONString(searchResponse.getHits()));System.out.println("=====testTermQuery=====");for (SearchHit documentFields : searchResponse.getHits().getHits()) {System.out.println(documentFields.getSourceAsMap());}}// 查询-匹配查询@Testvoid testMatchQuery() throws IOException {SearchRequest searchRequest = new SearchRequest("test_es_index");// 构造搜索条件SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("name", "User2");sourceBuilder.query(matchQueryBuilder);searchRequest.source(sourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);System.out.println(JSON.toJSONString(searchResponse.getHits()));System.out.println("=====testMatchQuery=====");for (SearchHit documentFields : searchResponse.getHits().getHits()) {System.out.println(documentFields.getSourceAsMap());}}// 查询-匹配所有@Testvoid testMatchAllQuery() throws IOException {SearchRequest searchRequest = new SearchRequest("test_es_index");// 构造搜索条件SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();sourceBuilder.query(matchAllQueryBuilder);sourceBuilder.timeout(new TimeValue(3, TimeUnit.MINUTES));searchRequest.source(sourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);System.out.println(JSON.toJSONString(searchResponse.getHits()));System.out.println("=====testMatchAllQuery=====");for (SearchHit documentFields : searchResponse.getHits().getHits()) {System.out.println(documentFields.getSourceAsMap());}}}

