zoukankan      html  css  js  c++  java
  • 第十一章:(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

      

  • 相关阅读:
    一个故事讲清NIO
    select()/poll() 的内核实现
    一个滑块验证破解网站并带例子
    第7章 数据清洗和准备
    关系检验
    数据分析常用的方法总结
    python数据清洗
    描述性绘图
    pandas常用方法总结
    各种windows软件下载
  • 原文地址:https://www.cnblogs.com/niujifei/p/15759303.html
Copyright © 2011-2022 走看看