第十一章:(2)Spring Boot 与 检索 之 整合 ElasticSearch

一、依赖

  创建一个项目,添加 elasticsearch 的相关依赖:

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

二、自动配置

  1、SpringData Elasticsearch 自动配置

  (1)ElasticsearchAutoConfiguration 类提供了Client 客户端节点信息,需要配置 ClusterNodes、ClusterName

    

  (2)ElasticsearchDataAutoConfiguration 提供了 ElasticsearchTemplate 操作 ES

    

  (3)ElasticsearchRepositoriesAutoConfiguration 中导入了 ElasticsearchRepository接口,可以通过这个接口对ES进行操作

  2、Jest 的自动配置 JestAutoConfiguration

    

     

  SpringBoot 默认支持两种技术和ES交互

  (1)Jest(默认不生效)
    需要导入 jest的工具包:io.searchbox.client.JestClient

  (2)使用SpringData ElasticSearch 操作

    ① 需要设置 提供了Client 客户端节点信息,需要配置 ClusterNodes、ClusterName

    ② 提供了 ElasticsearchTemplate 操作 ES

    ③ 可以使用 ElasticsearchRepository接口,可以通过这个接口对ES进行操作

三、使用 Jest 操作 ElasticSearch

  1、加入依赖

<!--Jest 依赖-->
<!--与 ElasticSearch 版本要匹配-->
<dependency>
    <groupId>io.searchbox</groupId>
    <artifactId>jest</artifactId>
    <version>5.3.3</version>
</dependency>

  2、配置 Elasticsearch 地址

    

     

     默认连接的是本地的 ElasticSearch,可以在配置文件中配置指定的IP地址,如下:

# Jest 的配置信息,远程主机地址
spring.elasticsearch.jest.uris=https://192.158.1.8:9200

  3、使用 JestClient 进行测试

  (1)测试索引(保存)

    @Autowired
    JestClient jestClient;

    //测试索引
    @Test
    public void test01() {
        //1、给ES中索引(保存)一个文档
        Article article = new Article();
        article.setId(1);
        article.setTitle("好消息");
        article.setAuthor("张三");
        article.setContent("Hello World!");

        //2、构建一个索引功能,Builder参数为要保存的文档,index设置索引,type设置类型,还可以使用id设置id
        Index index = new Index.Builder(article).index("njf").type("news").build();


        try {
            //3、执行
            jestClient.execute(index);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

  (2)测试查询

    //测试搜索
    @Test
    public void search() {
        //1、查询表达式
        String json = "{\n" +
                "    \"query\" : {\n" +
                "        \"match_phrase\" : {\n" +
                "            \"content\" : \"hello\"\n" +
                "        }\n" +
                "    }\n" +
                "}";

        //2、构建所搜功能,Builder参数为查询表达式,设置索引与类型
        Search search = new Search.Builder(json).addIndex("njf").addType("news").build();

        //3、执行
        try {
            SearchResult result = jestClient.execute(search);
            System.out.println(result.getJsonString());
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

 

四、使用 SpringData Elasticsearch 操作ES

  1、配置 SpringData 的信息

#SpringData ElasticSearch
spring.data.elasticsearch.cluster-name=elasticsearch
spring.data.elasticsearch.cluster-nodes=192.158.1.8:9300

  2、版本适配问题

  使用 SpringData ElasticSearch可能会出现适配问题【ES版本有可能版本不合适】

  版本适配说明:https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#reference

  

  如果版本不适配

         (1)升级SpringBoot版本

         (2)安装对应版本的 ES

  3、操作ES

  (1)使用 ElasticSearchRepository 接口

    ① 创建 BookElasticsearchRepository 接口

/**
 * ElasticsearchRepository<T, ID extends Serializable>
 *     两个泛型
 *     T:保存的类型
 *     ID:主键类型
 *
 */
public interface BookRepository extends ElasticsearchRepository<Book, Integer> {

    public List<Book> findByBookNameLike(String bookName);
}

    ② 创建Book类

//使用该注解指定 索引indexName 和类型type
@Document(indexName = "njf", type = "book")
public class Book {

    private Integer id;
    private String bookName;
    private String author;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getBookName() {
        return bookName;
    }

    public void setBookName(String bookName) {
        this.bookName = bookName;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", bookName='" + bookName + '\'' +
                ", author='" + author + '\'' +
                '}';
    }
}

    ③ 测试保存

    @Autowired
    BookRepository bookRepository;

    @Test
    public void test02() {
        Book book = new Book();
        book.setId(1);
        book.setAuthor("张三");
        book.setBookName("ES从入门到精通");

        bookRepository.index(book);
    }

    ④ 测试查询

    @Autowired
    BookRepository bookRepository;

    @Test
    public void test03() {
        Book book = new Book();
        book.setId(1);
        book.setAuthor("张三");
        book.setBookName("ES从入门到精通");

        List<Book> books = bookRepository.findByBookNameLike("入门");
        books.forEach(System.out::println);
    }

  (2)使用 ElasticsearchTemplate

  相关参考文档:

  https://docs.spring.io/spring-data/elasticsearch/docs/3.0.6.RELEASE/reference/html/

  https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#reference

  

原文地址:https://www.cnblogs.com/niujifei/p/15759303.html