image.png

SpringBoot初始化的项目默认的es版本和本地使用es的版本不一致是,可自定义es版本依赖,保证和本地的一致。
image.png

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

  1. <dependency>
  2. <groupId>org.elasticsearch.client</groupId>
  3. <artifactId>elasticsearch-rest-high-level-client</artifactId>
  4. <version>7.14.0</version>
  5. </dependency>

高级 Java REST 客户端依赖于以下工件及其传递依赖项:

  • org.elasticsearch.client:elasticsearch-rest-client
  • org.elasticsearch:elasticsearch

添加阿里的fastjson依赖,用来序列化json对象:

  1. <dependency>
  2. <groupId>com.alibaba</groupId>
  3. <artifactId>fastjson</artifactId>
  4. <version>1.2.78</version>
  5. </dependency>

初始化

一个RestHighLevelClient实例需要一个REST low-level client builder(REST 低级客户端构建器)来构建,如下所示:

  1. RestHighLevelClient client = new RestHighLevelClient(
  2. RestClient.builder(
  3. new HttpHost("localhost", 9200, "http"),
  4. new HttpHost("localhost", 9201, "http")));

高级客户端将在内部创建基于构建器创建一个提供执行请求的低级客户端。那个低级客户端维护一个连接池并启动一些线程,所以当你真正完成它时你应该关闭高级客户端,它会反过来关闭内部低级客户端以释放这些资源。可以通过实例的close方法,关闭连接并释放资源:

  1. client.close();

SpringBoot配置

  1. package com.es.config;
  2. import org.apache.http.HttpHost;
  3. import org.elasticsearch.client.RestClient;
  4. import org.elasticsearch.client.RestHighLevelClient;
  5. import org.springframework.context.annotation.Bean;
  6. import org.springframework.context.annotation.Configuration;
  7. @Configuration // 相当于spring xml配置
  8. public class ElasticSearchClientConfig {
  9. // 相当于spring <beans id="restHighLevelClient" class="RestHighLevelClient />
  10. @Bean
  11. public RestHighLevelClient restHighLevelClient() {
  12. RestHighLevelClient client = new RestHighLevelClient(
  13. RestClient.builder(
  14. new HttpHost("localhost", 9200, "http")
  15. )
  16. );
  17. return client;
  18. }
  19. }

API

Document APIS-文档Api

https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high-supported-apis.html

  1. package com.es;
  2. import com.alibaba.fastjson.JSON;
  3. import com.es.pojo.User;
  4. import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
  5. import org.elasticsearch.action.bulk.BulkRequest;
  6. import org.elasticsearch.action.bulk.BulkResponse;
  7. import org.elasticsearch.action.delete.DeleteRequest;
  8. import org.elasticsearch.action.delete.DeleteResponse;
  9. import org.elasticsearch.action.get.GetRequest;
  10. import org.elasticsearch.action.get.GetResponse;
  11. import org.elasticsearch.action.index.IndexRequest;
  12. import org.elasticsearch.action.index.IndexResponse;
  13. import org.elasticsearch.action.support.master.AcknowledgedResponse;
  14. import org.elasticsearch.action.update.UpdateRequest;
  15. import org.elasticsearch.action.update.UpdateResponse;
  16. import org.elasticsearch.client.RequestOptions;
  17. import org.elasticsearch.client.RestHighLevelClient;
  18. import org.elasticsearch.client.indices.CreateIndexRequest;
  19. import org.elasticsearch.client.indices.CreateIndexResponse;
  20. import org.elasticsearch.client.indices.GetIndexRequest;
  21. import org.elasticsearch.client.indices.GetIndexResponse;
  22. import org.elasticsearch.common.settings.Settings;
  23. import org.elasticsearch.common.xcontent.XContentType;
  24. import org.elasticsearch.core.TimeValue;
  25. import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
  26. import org.junit.jupiter.api.Test;
  27. import org.springframework.beans.factory.annotation.Autowired;
  28. import org.springframework.beans.factory.annotation.Qualifier;
  29. import org.springframework.boot.test.context.SpringBootTest;
  30. import java.io.IOException;
  31. import java.util.ArrayList;
  32. import java.util.HashMap;
  33. import java.util.Map;
  34. @SpringBootTest
  35. class EsApiApplicationTests {
  36. @Autowired
  37. @Qualifier("restHighLevelClient")
  38. private RestHighLevelClient client;
  39. // 测试索引的创建
  40. @Test
  41. void testCreateIndex() throws IOException {
  42. // 1、创建索引请求
  43. CreateIndexRequest request = new CreateIndexRequest("test_es_index");
  44. // 设置索引设置 Index settings
  45. request.settings(Settings.builder()
  46. .put("index.number_of_shards", 3)
  47. .put("index.number_of_replicas", 2)
  48. );
  49. // 设置索引类型 Index mappings
  50. Map<String, Object> textType = new HashMap<>();
  51. textType.put("type", "text");
  52. Map<String, Object> keywordType = new HashMap<>();
  53. keywordType.put("type", "keyword");
  54. Map<String, Object> integerType = new HashMap<>();
  55. integerType.put("type", "integer");
  56. Map<String, Object> properties = new HashMap<>();
  57. properties.put("name", textType);
  58. properties.put("email", keywordType);
  59. properties.put("age", integerType);
  60. Map<String, Object> mapping = new HashMap<>();
  61. mapping.put("properties", properties);
  62. request.mapping(mapping);
  63. // 2、客户端执行请求,请求后获取响应
  64. CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);
  65. System.out.println(createIndexResponse);
  66. }
  67. // 测试判断索引是否创建
  68. @Test
  69. void testExitIndex() throws IOException {
  70. GetIndexRequest request = new GetIndexRequest("test_es_index");
  71. boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
  72. System.out.println(exists);
  73. }
  74. // 测试获取索引
  75. @Test
  76. void testGetIndex() throws IOException {
  77. GetIndexRequest request = new GetIndexRequest("test_es_index");
  78. GetIndexResponse getIndexResponse = client.indices().get(request, RequestOptions.DEFAULT);
  79. System.out.println(getIndexResponse.getSettings());
  80. }
  81. // 测试删除索引
  82. @Test
  83. void testDeleteIndex() throws IOException {
  84. DeleteIndexRequest request = new DeleteIndexRequest("test_es_index");
  85. AcknowledgedResponse delete = client.indices().delete(request, RequestOptions.DEFAULT);
  86. System.out.println(delete.isAcknowledged());
  87. }
  88. // 测试添加文档
  89. @Test
  90. void testAddDocument() throws IOException {
  91. // 创建对象
  92. User user = new User("张三", 18, "zhangsan@email.com");
  93. // 创建请求
  94. IndexRequest request = new IndexRequest("test_es_index");
  95. request.id("1");
  96. request.timeout(TimeValue.timeValueSeconds(5));
  97. // 将json数据放入请求
  98. request.source(JSON.toJSONString(user), XContentType.JSON);
  99. // 客户端发送请求,获取响应的结果
  100. IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT);
  101. System.out.println(indexResponse.toString());
  102. System.out.println(indexResponse.status());
  103. }
  104. // 测试获取文档,判断是否存在 GET index/type/id
  105. @Test
  106. void testExitDocument() throws IOException {
  107. GetRequest getRequest = new GetRequest("test_es_index", "1");
  108. // 不获取返回的 _source 的上下文,提高执行速度
  109. getRequest.fetchSourceContext(new FetchSourceContext(false));
  110. boolean exists = client.exists(getRequest, RequestOptions.DEFAULT);
  111. System.out.println(exists);
  112. }
  113. // 测试获取文档信息
  114. @Test
  115. void testGetDocument() throws IOException {
  116. GetRequest getRequest = new GetRequest("test_es_index", "1");
  117. GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);
  118. System.out.println(getResponse.getSourceAsString()); // 打印文档内容,{"age":18,"name":"张三"}
  119. 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":"张三"}}
  120. }
  121. // 测试更新文档信息
  122. @Test
  123. void testUpdateDocument() throws IOException {
  124. UpdateRequest updateRequest = new UpdateRequest("test_es_index", "1");
  125. updateRequest.timeout("5s");
  126. User user = new User("李四", 25, "lisi@email.com");
  127. updateRequest.doc(JSON.toJSONString(user), XContentType.JSON);
  128. UpdateResponse updateResponse = client.update(updateRequest, RequestOptions.DEFAULT);
  129. System.out.println(updateResponse.status());
  130. System.out.println(updateResponse);
  131. }
  132. // 测试删除文档
  133. @Test
  134. void testDeleteDocument() throws IOException {
  135. DeleteRequest deleteRequest = new DeleteRequest("test_es_index", "1");
  136. deleteRequest.timeout("5s");
  137. DeleteResponse deleteResponse = client.delete(deleteRequest, RequestOptions.DEFAULT);
  138. System.out.println(deleteResponse.status());
  139. System.out.println(deleteResponse);
  140. }
  141. // 批量导入文档
  142. @Test
  143. void testBulkRequest() throws IOException {
  144. BulkRequest bulkRequest = new BulkRequest();
  145. bulkRequest.timeout("60s");
  146. ArrayList<User> userArrayList = new ArrayList<>();
  147. userArrayList.add(new User("User1", 6, "user1@email.com"));
  148. userArrayList.add(new User("User2", 18, "user2@email.com"));
  149. userArrayList.add(new User("User22", 18, "user22@email.com"));
  150. userArrayList.add(new User("User3", 32, "user3@email.com"));
  151. userArrayList.add(new User("User4", 18, "user4@email.com"));
  152. userArrayList.add(new User("User5", 50, "user5@email.com"));
  153. // 批处理请求
  154. for (int i = 0; i < userArrayList.size(); i++) {
  155. bulkRequest.add(
  156. new IndexRequest("test_es_index")
  157. .id("" + (i + 1))
  158. .source(JSON.toJSONString(userArrayList.get(i)), XContentType.JSON)
  159. );
  160. }
  161. BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);
  162. System.out.println(bulkResponse.status());
  163. System.out.println(bulkResponse.hasFailures());
  164. System.out.println(bulkResponse);
  165. }
  166. }

Search APIS-查询Api

https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/_search_apis.html

  1. package com.es;
  2. import com.alibaba.fastjson.JSON;
  3. import org.elasticsearch.action.search.SearchRequest;
  4. import org.elasticsearch.action.search.SearchResponse;
  5. import org.elasticsearch.client.RequestOptions;
  6. import org.elasticsearch.client.RestHighLevelClient;
  7. import org.elasticsearch.core.TimeValue;
  8. import org.elasticsearch.index.query.MatchAllQueryBuilder;
  9. import org.elasticsearch.index.query.MatchQueryBuilder;
  10. import org.elasticsearch.index.query.QueryBuilders;
  11. import org.elasticsearch.index.query.TermQueryBuilder;
  12. import org.elasticsearch.search.SearchHit;
  13. import org.elasticsearch.search.builder.SearchSourceBuilder;
  14. import org.junit.jupiter.api.Test;
  15. import org.springframework.beans.factory.annotation.Autowired;
  16. import org.springframework.beans.factory.annotation.Qualifier;
  17. import org.springframework.boot.test.context.SpringBootTest;
  18. import java.io.IOException;
  19. import java.util.concurrent.TimeUnit;
  20. @SpringBootTest
  21. public class EsSearchApiTests {
  22. @Autowired
  23. @Qualifier("restHighLevelClient")
  24. private RestHighLevelClient client;
  25. // 查询-精确查询
  26. @Test
  27. void testTermQuery() throws IOException {
  28. SearchRequest searchRequest = new SearchRequest("test_es_index");
  29. // 构造搜索条件
  30. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  31. // 查询条件,可以使用 QueryBuilders 工具来实现
  32. TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("age", "18");
  33. sourceBuilder.query(termQueryBuilder);
  34. searchRequest.source(sourceBuilder);
  35. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  36. System.out.println(JSON.toJSONString(searchResponse.getHits()));
  37. System.out.println("=====testTermQuery=====");
  38. for (SearchHit documentFields : searchResponse.getHits().getHits()) {
  39. System.out.println(documentFields.getSourceAsMap());
  40. }
  41. }
  42. // 查询-匹配查询
  43. @Test
  44. void testMatchQuery() throws IOException {
  45. SearchRequest searchRequest = new SearchRequest("test_es_index");
  46. // 构造搜索条件
  47. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  48. MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("name", "User2");
  49. sourceBuilder.query(matchQueryBuilder);
  50. searchRequest.source(sourceBuilder);
  51. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  52. System.out.println(JSON.toJSONString(searchResponse.getHits()));
  53. System.out.println("=====testMatchQuery=====");
  54. for (SearchHit documentFields : searchResponse.getHits().getHits()) {
  55. System.out.println(documentFields.getSourceAsMap());
  56. }
  57. }
  58. // 查询-匹配所有
  59. @Test
  60. void testMatchAllQuery() throws IOException {
  61. SearchRequest searchRequest = new SearchRequest("test_es_index");
  62. // 构造搜索条件
  63. SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
  64. MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
  65. sourceBuilder.query(matchAllQueryBuilder);
  66. sourceBuilder.timeout(new TimeValue(3, TimeUnit.MINUTES));
  67. searchRequest.source(sourceBuilder);
  68. SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
  69. System.out.println(JSON.toJSONString(searchResponse.getHits()));
  70. System.out.println("=====testMatchAllQuery=====");
  71. for (SearchHit documentFields : searchResponse.getHits().getHits()) {
  72. System.out.println(documentFields.getSourceAsMap());
  73. }
  74. }
  75. }