与 SpringBoot 集成

文档:

1、依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
  4. <version>a-version-match-your-es-version</version>
  5. </dependency>

spring-boot-starter-elasticsearch 各版本:

05-集成 SpringBoot - 图1image.png

阅读文档:Getting started 部分

兼容性说明:

决定性依赖:(es 的 starter 引入的决定性依赖)

查看引入的依赖是否与 ES 版本匹配:
05-集成 SpringBoot - 图3image.png

2、自动配置

05-集成 SpringBoot - 图5
image.png

  • ElasticsearchRestClientAutoConfiguration
    ```java @SuppressWarnings(“deprecation”) @Configuration(proxyBeanMethods = false) @ConditionalOnClass(RestClientBuilder.class) @EnableConfigurationProperties({ ElasticsearchProperties.class, ElasticsearchRestClientProperties.class,
    1. DeprecatedElasticsearchRestClientProperties.class })
    @Import({ RestClientBuilderConfiguration.class, RestHighLevelClientConfiguration.class,
    1. RestClientSnifferConfiguration.class })
    public class ElasticsearchRestClientAutoConfiguration {

}

  1. - 导入的组件:**_RestHighLevelClientConfiguration_**
  2. ```java
  3. // 导入的组件
  4. @Configuration(proxyBeanMethods = false)
  5. @ConditionalOnClass(RestHighLevelClient.class)
  6. @ConditionalOnMissingBean({ RestHighLevelClient.class, RestClient.class })
  7. static class RestHighLevelClientConfiguration {
  8. @Bean
  9. RestHighLevelClient elasticsearchRestHighLevelClient(RestClientBuilder restClientBuilder) {
  10. return new RestHighLevelClient(restClientBuilder);
  11. }
  12. }

3、创建组件

初始化,参考:

  1. @Configuration
  2. public class ElasticsearchClientConfig {
  3. @Bean
  4. public RestHighLevelClient restHighLevelClient() {
  5. return new RestHighLevelClient(
  6. RestClient.builder(
  7. new HttpHost("localhost", 9200, "http")));
  8. }
  9. }

4、索引操作

  • 创建索引 CreateIndexRequest
  • 判断索引是否存在 GetIndexRequest
  • 删除索引 DeleteIndexRequest
  1. /*
  2. 创建索引
  3. */
  4. @Test
  5. public void createIdx() throws IOException {
  6. // A request to create an index
  7. CreateIndexRequest indexRequest = new CreateIndexRequest("engure_test");
  8. // Creates an index using the Create Index API
  9. CreateIndexResponse response = restHighLevelClient.indices().create(indexRequest,
  10. RequestOptions.DEFAULT);
  11. log.info("ack:{}, shardsAck:{}", response.isAcknowledged(), response.isShardsAcknowledged());
  12. }
  13. /*
  14. 判断是否存在
  15. */
  16. @Test
  17. public void isIdxExist() throws IOException {
  18. GetIndexRequest indexRequest = new GetIndexRequest("engure_test");
  19. boolean exists = restHighLevelClient.indices().exists(indexRequest, RequestOptions.DEFAULT);
  20. log.info("exists:{}", exists);
  21. }
  22. /*
  23. 删除索引
  24. */
  25. @Test
  26. public void delIdx() throws IOException {
  27. DeleteIndexRequest indexRequest = new DeleteIndexRequest("engure_test");
  28. AcknowledgedResponse response =
  29. restHighLevelClient.indices().delete(indexRequest, RequestOptions.DEFAULT);
  30. log.info("act:{}", response.isAcknowledged());
  31. }
  • restHighLevelClient.indices() Provides an IndicesClient which can be used to access the Indices API.

5、文档操作

  • 添加。IndexRequest、index()
  • 判断存在。GetRequest、exist()
  • 根据 id 获取。GetRequest、get()
  • 更新。UpdateRequest、update()
  • 删除。DeleteRequest、delete()
  • 补充:批量操作。BulkRequest、bulk()
  • 查询。SearchRequest、SearchSourceBuilder、search()

添加

  1. /*
  2. 添加文档
  3. */
  4. @Test
  5. public void addDoc() throws IOException {
  6. // 准备对象
  7. User user = new User("engure", 18, "1999-01-01", Arrays.asList("技术宅", "猛男"));
  8. // 创建请求
  9. IndexRequest request = new IndexRequest("engure_test");
  10. // 相关参数
  11. request.id("1");
  12. request.timeout(TimeValue.timeValueSeconds(1));
  13. // 将对象转换为 json,放入请求
  14. request.source(JSON.toJSONString(user), XContentType.JSON);
  15. // Index a document using the Index API.
  16. IndexResponse response = restHighLevelClient.index(request, RequestOptions.DEFAULT);
  17. log.info("{}", response.toString());
  18. }

判断存在

  1. /*
  2. 判断存在
  3. */
  4. @Test
  5. public void isDocExist() throws IOException {
  6. // 创建对象
  7. GetRequest getRequest = new GetRequest("engure_test");
  8. getRequest.id("1");
  9. // 判断是否存在
  10. boolean exists = restHighLevelClient.exists(getRequest, RequestOptions.DEFAULT);
  11. log.info("exists:{}", exists);
  12. }

根据 id 获取

  1. /*
  2. 获取文档
  3. */
  4. @Test
  5. public void getDoc() throws IOException {
  6. GetRequest request = new GetRequest("engure_test");
  7. request.id("1");
  8. GetResponse response = restHighLevelClient.get(request, RequestOptions.DEFAULT);
  9. log.info("doc: {}", response.toString());
  10. log.info("source: {}", response.getSource());
  11. }

更新

  1. /*
  2. 更新文档
  3. */
  4. @Test
  5. public void updateDoc() throws IOException {
  6. // 创建更新
  7. UpdateRequest request = new UpdateRequest("engure_test", "1");
  8. // 传入更新内容
  9. // post idx/_doc/1/_update
  10. // { doc: {} }
  11. request.doc(JSON.toJSONString(new User("engureguo", 20, "1999-09-09", null)), XContentType.JSON);
  12. // 文档覆盖更新,而不是文档删除更新!
  13. // 执行更新
  14. UpdateResponse response = restHighLevelClient.update(request, RequestOptions.DEFAULT);
  15. log.info("update: {}", response.toString());
  16. }

删除

  1. /*
  2. 删除文档
  3. */
  4. @Test
  5. public void delDoc() throws IOException {
  6. DeleteRequest request = new DeleteRequest("engure_test");
  7. request.id("1");
  8. DeleteResponse response = restHighLevelClient.delete(request, RequestOptions.DEFAULT);
  9. log.info("del: {}", response.toString());
  10. }

批量操作

  1. /*
  2. 批量操作。 添加、删除或更新
  3. */
  4. @Test
  5. public void bulkDoc() throws IOException {
  6. BulkRequest bulkRequest = new BulkRequest();
  7. bulkRequest.timeout(TimeValue.timeValueSeconds(3));
  8. for (int i = 1; i <= 10; i++) {
  9. // 添加请求。 同理可以是删除或更新
  10. IndexRequest req = new IndexRequest("engure_test"); // 不指定 id 则随机生成
  11. req.source(JSON.toJSONString(new User("engure" + String.valueOf(i), 10 + i, "1999-01-01", null)),
  12. XContentType.JSON);
  13. req.timeout(TimeValue.timeValueSeconds(1));
  14. // 将请求加入 bulk 请求
  15. bulkRequest.add(req);
  16. }
  17. BulkResponse bulkResponse = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
  18. log.info("bulk response {}", bulkResponse.toString());
  19. }

查询

  1. /*
  2. 查询文档(复杂查询)
  3. */
  4. @Test
  5. public void searchDoc() throws IOException {
  6. SearchRequest searchRequest = new SearchRequest("engure_test");
  7. // 创建查询构建器对象
  8. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  9. searchRequest.source(searchSourceBuilder);
  10. // 创建查询构建器对象
  11. TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "engure");
  12. searchSourceBuilder.query(termQueryBuilder);
  13. // 排序、分页
  14. searchSourceBuilder.sort("age", SortOrder.DESC);
  15. searchSourceBuilder.from(0);
  16. searchSourceBuilder.size(5);
  17. // 高亮
  18. HighlightBuilder highlightBuilder = new HighlightBuilder();
  19. highlightBuilder.field("name");
  20. highlightBuilder.preTags("<b>");
  21. highlightBuilder.postTags("</b>");
  22. searchSourceBuilder.highlighter(highlightBuilder);
  23. SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
  24. log.info("search res: {}", searchResponse.toString());
  25. }