欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SpringBoot2.x系列教程55--NoSQL之SpringBoot整合ElasticSearch方式二

程序员文章站 2022-07-04 09:08:46
...

SpringBoot2.x系列教程55--NoSQL之SpringBoot整合ElasticSearch方式二

作者:一一哥

在上一节中,我带大家学习了在Spring Boot中整合Elastic Search的第一种方式,这种方式是直接利用TransportClient实现增删改查,有点麻烦。接下来我带大家利用ElasticSearchRepository实现第2种方式的增删改查。

一. Spring Boot整合Elastic Search

1. 创建web项目

我们按照之前的经验,创建一个web程序,并将之改造成Spring Boot项目,具体过程略。
SpringBoot2.x系列教程55--NoSQL之SpringBoot整合ElasticSearch方式二

2. 添加依赖

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

注意:因为我的elastic search 并不是6.5.x以上的最新版本,而是5.6.8版本,所以我这里使用的还是spring-boot-starter-data-elasticsearch的依赖包。

3. 创建application.yml文件

# Elasticsearch cluster name.
spring:
  data:
    elasticsearch:
      cluster-name: elasticsearch
      # Comma-separated list of cluster node addresses.
      cluster-nodes: localhost:9300
      # Whether to enable Elasticsearch repositories.
      repositories:
        enabled: true

4. 创建Book实体类

package com.yyg.boot.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

/**
 *Document:
 * indexName = "book":索引名称,类似于mysql中的数据库;
 * type = "doc":文档类型,类似于mysql中的表;
 * shards = 5:分片数量
 * replicas = 1:副本
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Document(indexName = "book", type = "doc", shards = 5, replicas = 1)
public class Book {

    @Id
    private String id;

    /**
     * 中文分词设置,前提是您的es已经安装了中文分词ik插件
     * 中文分词有两种形式:
     * ik_max_word:会将文本做最细粒度的拆分
     * ik_smart:会将文本做最粗粒度的拆分
     */
    @Field(type = FieldType.Text, analyzer = "ik_max_word",searchAnalyzer ="ik_max_word")
    private String title;

    private String author;

    private String postDate;

}

5. 创建Repository仓库类

package com.yyg.boot.repository;

import com.yyg.boot.entity.Book;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.annotations.Query;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

public interface BookRepository extends ElasticsearchRepository<Book, String> {

    //Optional<Book> findById(String id);

    Page<Book> findByAuthor(String author, Pageable pageable);
    
}

6. 定义Service及其实现类

BookService接口

package com.yyg.boot.service;

import com.yyg.boot.entity.Book;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;

import java.util.List;
import java.util.Optional;

public interface BookService {

    Optional<Book> findById(String id);

    Book save(Book blog);

    void delete(Book blog);

    Optional<Book> findOne(String id);

    List<Book> findAll();

    Page<Book> findByAuthor(String author, PageRequest pageRequest);

}

BookServiceImpl实现类

package com.yyg.boot.service.impl;

import com.yyg.boot.entity.Book;
import com.yyg.boot.repository.BookRepository;
import com.yyg.boot.service.BookService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;

@Slf4j
@Service
public class BookServiceImpl implements BookService {

    @Autowired
    private BookRepository bookRepository;

    @Override
    public Optional<Book> findById(String id) {
        return bookRepository.findById(id);
    }

    @Override
    public Book save(Book blog) {
        return bookRepository.save(blog);
    }

    @Override
    public void delete(Book blog) {
        bookRepository.delete(blog);
    }

    @Override
    public Optional<Book> findOne(String id) {
        return bookRepository.findById(id);
    }

    @Override
    public List<Book> findAll() {
        return (List<Book>) bookRepository.findAll();
    }

    @Override
    public Page<Book> findByAuthor(String author, PageRequest pageRequest) {
        return bookRepository.findByAuthor(author, pageRequest);
    }

}

7. 创建BookController接口

package com.yyg.boot.web;

import com.yyg.boot.entity.Book;
import com.yyg.boot.service.BookService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.web.bind.annotation.*;

import java.util.Optional;

@Slf4j
@RestController
@RequestMapping("/book")
public class ElasticController {

    @Autowired
    private BookService bookService;

    @Autowired
    private ElasticsearchTemplate elasticsearchTemplate;

    /**
     * 创建索引
     */
    @PostMapping("/create")
    public void createIndex() {
        elasticsearchTemplate.createIndex(Book.class);
    }

    @PostMapping("/save")
    public void Save() {
        Book book = new Book("100", "ElasticSearch第2种实现方式", "一一哥", "2020-04-13");
        log.warn(book.toString());
        bookService.save(book);
    }

    @GetMapping("/id/{id}")
    public Book getBookById(@PathVariable String id) {
        Optional<Book> opt = bookService.findById(id);
        Book book = opt.get();
        log.warn(book.toString());
        return book;
    }

}

8. 创建Application入口类

package com.yyg.boot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ElasticSearchApplication {

    public static void main(String[] args) {
        SpringApplication.run(ElasticSearchApplication.class, args);
    }

}

9. 完整项目结构

SpringBoot2.x系列教程55--NoSQL之SpringBoot整合ElasticSearch方式二

10. 启动项目进行测试

测试创建索引接口

在postman中执行创建索引的接口,可以看到成功执行。
SpringBoot2.x系列教程55--NoSQL之SpringBoot整合ElasticSearch方式二

然后在kibana中同步索引进来。
SpringBoot2.x系列教程55--NoSQL之SpringBoot整合ElasticSearch方式二

此时发现索引库中还没有任何内容。
SpringBoot2.x系列教程55--NoSQL之SpringBoot整合ElasticSearch方式二

添加内容
在postman中执行添加索引内容的操作。
SpringBoot2.x系列教程55--NoSQL之SpringBoot整合ElasticSearch方式二

查询索引库
此时发现kibana中已经有了索引数据,说明我们之前添加的索引已经成功了。
SpringBoot2.x系列教程55--NoSQL之SpringBoot整合ElasticSearch方式二

安装id查询索引数据
SpringBoot2.x系列教程55--NoSQL之SpringBoot整合ElasticSearch方式二

至此,我们实现了在Spring Boot中整合Elastic Search,当然关于ElasticSearch的用法还有很多,在此不一一介绍了。