SpringBoot学习(十四):整合Elasticsearch

这里是一个学习过程笔记的汇总:Spring Boot学习汇总


这节的学习,我们首先得了解什么是Elasticsearch,并会简单实用,关于这一块,直接去看es的官方文档即可,非常详细,极力推荐: es权威指南-中文版

大概了解了es之后,下面就开始我们今天的学习,首先快速创建一个springboot项目,添加web和es模块即可。

首先我们本地需要安装es,然后启动,启动好之后,浏览器输入:http://localhost:9200/

若出现如下信息,这说明es启动成功。

返回信息中的number:2.3.2  就是你的es的版本号。

接下来直接启动项目,也是直接启动成功,我们并没有配置任何的es相关信息,但一样启动成功,说明只要引入了相关模块,es就有相应的默认配置。

我们看一下pom文件,引入es模块后,导了如下包:

 <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

Spring Boot默认是支持两种方式和es交互:

 1、SpringData Elasticsearch

        这是一个默认生效的,即上面默认导入的jar包

2、Jest

     默认不生效,将自动导入的spring-boot-starter-data-elasticsearch包注释,导入如下io.searchbox.jest包,即可生效。

    es用的是哪个版本,导的包就是哪个版本,若es是2.3.2,那么导包就导2.x.x的版本即可

<dependency>
     <groupId>io.searchbox</groupId>
     <artifactId>jest</artifactId>
     <version>2.4.0</version>
</dependency>
Jest测试:

1、修改pom文件,注释掉原来的spring-boot-starter-data-elasticsearch包,加入io.searchbox.jest包

2、创建Article类

package com.example.springbootelasticsearch.domain;

import io.searchbox.annotations.JestId;

/**
 * @author pavel
 * @date 2018/12/10 0010
 */
public class Article {

    @JestId
    private Integer id;
    private String author;
    private String title;
    private String content;

    public Integer getId() {
        return id;
    }

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

    public String getAuthor() {
        return author;
    }

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

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}

3、测试

3.1、给es中索引(保存)一个文档

package com.example.springbootelasticsearch;

import com.example.springbootelasticsearch.domain.Article;
import io.searchbox.client.JestClient;
import io.searchbox.core.Index;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.io.IOException;
import java.util.Arrays;
import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootElasticsearchApplicationTests {

    /**
     * 和es交互
     */
    @Autowired
    private JestClient jestClient;


    @Test
    public void contextLoads() {
        // 给es中索引(保存)一个文档
        Article article = new Article();
        article.setId(1);
        article.setTitle("good news");
        article.setAuthor("zhangsan");
        article.setContent("hello word");
        // 创建一个索引  索引名为:west-lake    类型名为:news   文档为:article对象
        Index index = new Index.Builder(article).index("west-lake").type("news").build();
        try {
            // 执行
            jestClient.execute(index);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

直接运行,控制台无报错,然后postman(一个模拟http请求的工具,自行百度)访问:http://localhost:9200/west-lake/news/1

这个就是刚才索引到es的article文档。

测试搜索,这个得加搜索条件,我们就用官方文档中的添加查询表达式,json格式的:

    // 测试搜索
    public void getArticle() {
        // 查找作者叫 zhangsan的
        String json = "{\n" +
                "    \"query\" : {\n" +
                "        \"match\" : {\n" +
                "            \"author\" : \"zhangsan\"\n" +
                "        }\n" +
                "    }\n" +
                "}";
        Search search = new Search.Builder(json).addIndex("west-lack").addType("news").build();
        try {
            SearchResult result = jestClient.execute(search);
            // 打印一个搜索结果的json串
            System.out.println(result.getJsonString());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

运行,看控制台输出:

搜索完成。

剩下的功能可以自己根据前面给出的官方文档来测试一下。

SpringData Elasticsearch测试:

我们先看一下这块的源码:

看下这个自动配置文件

再看下配置参数类ElasticsearchProperties:

可见需要配置clusterName和clusterNodes,clusterName有默认值,下面看一下具体操作。

1、修改pom,放开导入es模块的自动导入的包:

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

2、修改主配置类Application.properties,增加如下配置:

spring.data.elasticsearch.cluster-nodes=http://localhost:9300

3、启动项目

4、有两种方式和es进行交互:

        4.1、编写一个ElasticsearchRepository的子接口来操作es

        4.2、ElasticsearchTemplate操作es

这里就测试编写一个ElasticsearchRepository的子接口来操作es

编写一个Book实体类:

package com.example.springbootelasticsearch.domain;

import org.springframework.data.elasticsearch.annotations.Document;

/**
 * @author pavel
 * @date 2018/12/10 0010
 */
// 表明索引名称以及类型名称(没有回自动创建)
@Document(indexName = "west-lake",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 + '\'' +
                '}';
    }
}

编写BookRepository接口,继承ElasticsearchRepository接口

package com.example.springbootelasticsearch.repository;

import com.example.springbootelasticsearch.domain.Book;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

/**
 * @author pavel
 * @date 2018/12/10 0010
 */
public interface BookRepository extends ElasticsearchRepository<Book, Integer> {
    
}

我们可以看一下ElasticsearchRepository接口:

这个接口又继承自ElasticsearchCrudRepository接口,简介的继承了CrudRepository接口,如下:

这里是一堆的增删改查方法,所以说,我们这里继承了ElasticsearchRepository接口后,就拥有了该对象的增删改查方法,就类似于之前讲的jpa中的dao继承了JpaRepository接口,就拥有了增删改查方法。

测试代码如下:

    @Autowired
    private BookRepository bookRepository;

    @Test
    public void test02() {
        Book book = new Book();
        book.setId(2);
        book.setAuthor("大冰");
        book.setBookName("《他们最幸福》,《乖,摸摸头》,《阿弥陀佛么么哒》,《好吗好的》,《我不》,《你坏》");
        bookRepository.index(book);
    }

直接运行,报错:

查询了一下,这个是因为,spring-data导入的elasticsearch包版本和本地启动的es版本不匹配,

我启动的es是2.3.2,而spring-data导入的却是3.1.3

官网上给的正确匹配结果是:

所以有两种解决方案:1,将本地es升级到6以上版本,  2、重新导入2.x.x版本的spring-data-elasticsearch包

我就直接重新下载一个6以上版本的es好了,下载好之后启动,然后再访问:

下面在BookRepository中自定义一个方法进行查询。

package com.example.springbootelasticsearch.repository;

import com.example.springbootelasticsearch.domain.Book;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

import java.util.List;

/**
 * @author pavel
 * @date 2018/12/10 0010
 */
public interface BookRepository extends ElasticsearchRepository<Book, Integer> {

    List<Book> findByBookNameLike(String bookName);

}

测试:

    @Test
    public void test03() {
        List<Book> bookList = bookRepository.findByBookNameLike("《他们最幸福》");
        for (Book book : bookList) {
            System.out.println(book.toString());
        }
    }

运行,控制台输出:

还有一些方法,都可以试一下,自己来搞吧。

发布了34 篇原创文章 · 获赞 43 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/pavel101/article/details/84937071
今日推荐