【SpringBoot】SpringBoot 整合ElasticSearch(二十一)

自古美人都是妖i 提交于 2020-08-17 12:40:39

  本章介绍SpringBoot与ElasticSearch整合,SpringBoot默认支持两种技术来与ES交互

    1、Jest(默认不生效,需要导入jest工具包)

    2、SpringBoot ElasticSearch(ES版本可能不合适,需要相应版本)

  ElasticSearch安装参考:【ElasticSearch】 安装

ElasticSearch自动配置

  1、搭建SpringBoot项目,pom.xml文件如下:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0"
 3          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 5     <modelVersion>4.0.0</modelVersion>
 6 
 7     <groupId>com.test</groupId>
 8     <artifactId>test-springboot-es</artifactId>
 9     <version>1.0-SNAPSHOT</version>
10 
11     <parent>
12         <groupId>org.springframework.boot</groupId>
13         <artifactId>spring-boot-starter-parent</artifactId>
14         <version>2.1.8.RELEASE</version>
15     </parent>
16 
17     <properties>
18 
19         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
20         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
21         <java.version>1.8</java.version>
22     </properties>
23 
24     <dependencies>
25 
26         <dependency>
27             <groupId>org.springframework.boot</groupId>
28             <artifactId>spring-boot-starter-web</artifactId>
29         </dependency>
30 
31         <!-- SpringBoot默认使用SpringData ElasticSearch模块进行操作 -->
32         <dependency>
33             <groupId>org.springframework.boot</groupId>
34             <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
35         </dependency>
36 
37         <!-- https://mvnrepository.com/artifact/io.searchbox/jest -->
38         <!--<dependency>-->
39             <!--<groupId>io.searchbox</groupId>-->
40             <!--<artifactId>jest</artifactId>-->
41             <!--<version>6.3.1</version>-->
42         <!--</dependency>-->
43 
44         <dependency>
45             <groupId>org.springframework.boot</groupId>
46             <artifactId>spring-boot-starter-test</artifactId>
47             <scope>test</scope>
48         </dependency>
49 
50     </dependencies>
51 
52 
53     <!-- SpringBoot打包插件,可以将代码打包成一个可执行的jar包 -->
54     <build>
55         <plugins>
56             <plugin>
57                 <groupId>org.springframework.boot</groupId>
58                 <artifactId>spring-boot-maven-plugin</artifactId>
59             </plugin>
60         </plugins>
61     </build>
62 </project>
pom.xml

  2、查看spring-boot-autoconfigure中,在org.springframework.boot.autoconfigure.data.elasticsearch包下有很多Elasticsearch自动配置类,可以分别查看,可以看到注入了对象,其中有ElasticsearchRepositoriesAutoConfiguration、ElasticsearchDataAutoConfiguration等

    

  3、启动ElasticsearchDataAutoConfiguration类中,自动注入了ElasticsearchTemplate,用于操作Elasticsearch

 1 public class ElasticsearchDataAutoConfiguration {
 2 
 3     @Bean
 4     @ConditionalOnMissingBean
 5     @ConditionalOnBean(Client.class)
 6     public ElasticsearchTemplate elasticsearchTemplate(Client client, ElasticsearchConverter converter) {
 7         try {
 8             return new ElasticsearchTemplate(client, converter);
 9         }
10         catch (Exception ex) {
11             throw new IllegalStateException(ex);
12         }
13     }
14 
15     ...
16 }

  4、查看spring-boot-autoconfigure中,在org.springframework.boot.autoconfigure.elasticsearch.jest包下,有JestAutoConfiguration自动配置类,它给SpringBoot自动注入了JestClient也是用来操作Elasticsearch的

 1 public class JestAutoConfiguration {
 2 
 3     ...
 4 
 5     @Bean(destroyMethod = "shutdownClient")
 6     @ConditionalOnMissingBean
 7     public JestClient jestClient() {
 8         JestClientFactory factory = new JestClientFactory();
 9         factory.setHttpClientConfig(createHttpClientConfig());
10         return factory.getObject();
11     }
12 
13     ...
14 }

SpringBoot整合Jest

  1、在SpringBoot项目中,引入Jest依赖

1 <dependency>
2     <groupId>io.searchbox</groupId>
3     <artifactId>jest</artifactId>
4     <version>6.3.1</version>
5 </dependency>

  2、添加jest的es配置信息

spring:
  elasticsearch:
    jest:
      uris: http://192.168.0.1:9200

  3、编写测试类,测试jest,内容如下:

 1 package com.test.springboot.es;
 2 
 3 import com.test.springboot.es.bean.Article;
 4 import io.searchbox.client.JestClient;
 5 import io.searchbox.core.Index;
 6 import io.searchbox.core.Search;
 7 import io.searchbox.core.SearchResult;
 8 import org.junit.Test;
 9 import org.junit.runner.RunWith;
10 import org.springframework.beans.factory.annotation.Autowired;
11 import org.springframework.boot.test.context.SpringBootTest;
12 import org.springframework.test.context.junit4.SpringRunner;
13 
14 import java.io.IOException;
15 
16 @RunWith(SpringRunner.class)
17 @SpringBootTest
18 public class TestApplication {
19 
20     @Autowired
21     JestClient jestClient;
22 
23     // 给ES索引(保存)一个文档
24     @Test
25     public void contextLoad() throws IOException {
26         Article article = new Article();
27         article.setId(1);
28         article.setTitle("好消息");
29         article.setAuthor("张三");
30         article.setContent("Hello Word");
31 
32         // 构建一个索引功能
33         Index index = new Index.Builder(article).index("test").type("news").build();
34         // 执行
35         jestClient.execute(index);
36     }
37 
38     // 测试Jest搜索
39     @Test
40     public void jestSearch() throws IOException {
41 
42         String json = "{\n" +
43                 "    \"query\" : {\n" +
44                 "        \"match\" : {\n" +
45                 "            \"content\" : \"Hello\"\n" +
46                 "        }\n" +
47                 "    }\n" +
48                 "}";
49 
50         // 构建一个搜索功能
51         Search search = new Search.Builder(json).addIndex("test").addType("news").build();
52         // 执行
53         SearchResult result = jestClient.execute(search);
54         // 打印结果
55         System.out.println(result.getJsonString());
56     }
57 }

  4、测试方法

    运行方法contextLoad(),保存数据,使用地址(http://192.168.0.1:9200/test/news/_search)访问ElasticSearch,获得数据如下:

    

    运行jestSearch() 方法,测试Jest搜索,效果如下:

    

  5、更多jestClient,可以参考官方文档:https://github.com/searchbox-io/Jest/tree/master/jest

SpringBoot整合ElasticSearch

  1、在SpringBoot项目中,引入依赖spring-boot-starter-data-elasticsearch,版本问题参考官网:https://docs.spring.io/spring-data/elasticsearch/docs/4.0.0.M4/reference/html/#preface.versions

1 <!-- SpringBoot默认使用SpringData ElasticSearch模块进行操作 -->
2 <dependency>
3     <groupId>org.springframework.boot</groupId>
4     <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
5 </dependency>

  2、添加elasticsearch的配置信息

spring:
  data:
    elasticsearch:
      #集群名称
      cluster-name: elasticsearch
      #节点
      cluster-nodes: 192.168.0.1:9300

    注:其中节点的端口使用的是9300端口,也就是ES节点之间通讯使用的端口。 

  3、编辑方法save(),保存数据到elasticsearch中,内容如下:

 1 @RunWith(SpringRunner.class)
 2 @SpringBootTest
 3 public class TestApplication2 {
 4 
 5     @Autowired
 6     ElasticsearchTemplate elasticsearchTemplate;
 7 
 8     // 给ES索引(保存)一个文档
 9     @Test
10     public void save() {
11         Article article = new Article();
12         article.setId(1);
13         article.setTitle("好消息");
14         article.setAuthor("张三");
15         article.setContent("Hello Word");
16 
17         IndexQuery indexQuery = new IndexQueryBuilder()
18                 .withId(article.getId().toString())
19                 .withObject(article)
20                 .build();
21 
22         // 存入索引,返回文档ID
23         String documentId = elasticsearchTemplate.index(indexQuery);
24         System.out.println(documentId);
25 
26     }
27 }

     注意Article类需要进行文档注释,内容如下,否则报错

1 @Document(indexName="test", type = "news")
2 public class Article {
3 
4     private Integer id;
5     private String author;
6     private String title;
7     private String content;
8 }

  4、测试方法save(),运行save()方法后,使用浏览器访问es,地址:http://192.168.0.1:9200/test/news/1

      

  5、编辑方法search(),查询数据

 1 // 测试elasticsearchTemplate搜索
 2 @Test
 3 public void search() throws IOException {
 4 
 5     String json = "{\n" +
 6             "        \"match\" : {\n" +
 7             "            \"content\" : \"Hello\"\n" +
 8             "        }\n" +
 9             "    }";
10 
11     StringQuery query = new StringQuery(json);
12     query.addIndices("test");
13     query.addTypes("news");
14 
15     List<Article> articles = elasticsearchTemplate.queryForList(query, Article.class);
16     if(articles.size() > 0) {
17         for (Article a : articles){
18             System.out.println(a.toString());
19         }
20     }
21

  6、执行方法search(),结果如下:

    

  Spring Data Repositories功能

    参考文档:https://docs.spring.io/spring-data/elasticsearch/docs/4.0.0.M4/reference/html/#repositories

    编写一个ElasticsearchRepository的子接口来操ES

  7、编写ElasticsearchRepository的子接口,无需使用@Repository注解,SpringBoot会自动注入容器

1 package com.test.springboot.es.bean.repository;
2 
3 import com.test.springboot.es.bean.Article;
4 import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
5 
6 public interface ArticleRepository extends ElasticsearchRepository<Article, Integer> {
7 }

  8、编写测试方法,测试ArticleRepository类的保存

 1 @Autowired
 2 ArticleRepository articleRepository;
 3 
 4 @Test
 5 public void test01(){
 6     Article article = new Article();
 7     article.setId(2);
 8     article.setTitle("慢消息");
 9     article.setAuthor("李四");
10     article.setContent("Hello XXXX");
11 
12     articleRepository.save(article);
13 
14 }

  9、运行方法test01(),之后查询索引test,地址:http://192.168.0.1:9200/test/news/_search

    

  10、自定义查询方法,在ArticleRepository类中,增加findByAuthor方法

1 public interface ArticleRepository extends ElasticsearchRepository<Article, Integer> {
2 
3     List<Article> findByAuthor(String author);
4 
5 }

  11、编辑测试方法forindByAuthor()

1 @Test
2 public void forindByAuthor(){
3     List<Article> articles = articleRepository.findByAuthor("李四");
4     if(articles.size() > 0) {
5         for (Article a : articles){
6             System.out.println(a.toString());
7         }
8     }
9 }

  12、测试自定义查询方法

    

    更多规则参考官网文档:https://docs.spring.io/spring-data/elasticsearch/docs/4.0.0.M4/reference/html/#repositories.query-methods

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!