ElasticSearch7入门(六)SpringBoot2.3.0集成ElasticSearch7.5.2-SpringData

本文涉及的产品
Elasticsearch Serverless通用抵扣包,测试体验金 200元
简介: ElasticSearch7入门(六)SpringBoot2.3.0集成ElasticSearch7.5.2-SpringData

背景


上一篇使用HighLevelClient的方式实现了SpringBoot集成ElasticSearch。今天换作SpringDataElasticsearch来完成SpringBootElasticSearch的集成。SpringData系列借助自定义的命名规则,直接定义完接口,它可以帮助我们自动实现接口。


核心依赖


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


领域模型


package com.heartsuit.domain;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.DateFormat;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import java.time.LocalDateTime;
/**
 * @Author Heartsuit
 * @Date 2020-06-12
 */
@Data
//@Document(indexName = "book", useServerConfiguration = true, createIndex = false)
@Document(indexName = "book")
public class Book {
    @Id
    private String id;
    @Field(type = FieldType.Text)
    private String title;
    @Field(type = FieldType.Keyword, analyzer = "ik_smart", searchAnalyzer = "ik_smart")
    private String author;
    @Field(name = "word_count", type = FieldType.Integer)
    private Integer wordCount;
    /**
     * 1. Jackson日期时间序列化问题:
     * Cannot deserialize value of type `java.time.LocalDateTime` from String "2020-06-04 15:07:54": Failed to deserialize java.time.LocalDateTime: (java.time.format.DateTimeParseException) Text '2020-06-04 15:07:54' could not be parsed at index 10
     * 解决:@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     * 2. 日期在ES存为long类型
     * 解决:需要加format = DateFormat.custom
     * 3. java.time.DateTimeException: Unable to obtain LocalDate from TemporalAccessor: {DayOfMonth=5, YearOfEra=2020, MonthOfYear=6},ISO of type java.time.format.Parsed
     * 解决:pattern = "uuuu-MM-dd HH:mm:ss" 即将yyyy改为uuuu,或8uuuu: pattern = "8uuuu-MM-dd HH:mm:ss"
     * 参考:https://www.elastic.co/guide/en/elasticsearch/reference/current/migrate-to-java-time.html#java-time-migration-incompatible-date-formats
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Field(name = "publish_date", type = FieldType.Date, format = DateFormat.custom, pattern = "uuuu-MM-dd HH:mm:ss")
    private LocalDateTime publishDate;
}


核心方法


package com.heartsuit.repository;
import java.util.List;
import com.heartsuit.domain.Book;
import org.springframework.data.elasticsearch.annotations.Query;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
/**
 * @Author Heartsuit
 * @Date 2020-06-12
 */
public interface BookRepository extends ElasticsearchRepository<Book, String> {
  List<Book> findByAuthor(String author);
  List<Book> findByAuthorLike(String author);
  List<Book> findByTitle(String author);
  List<Book> findByWordCount(Integer wordCount);
  List<Book> findByAuthorAndTitle(String author, String title);
  @Query("{\"bool\" : {\"must\" : {\"match\" : {\"title\" : \"?0\"}}}}")
  List<Book> queryByTitle(String keyword);
}


测试接口


package com.heartsuit.controller;
import com.heartsuit.domain.Book;
import com.heartsuit.repository.BookRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
import java.util.*;
/**
 * @Author Heartsuit
 * @Date 2020-06-12
 */
@RestController
@RequestMapping("/books")
@Slf4j
public class BookController {
    private final BookRepository bookRepository;
    public BookController(BookRepository bookRepository) {
        this.bookRepository = bookRepository;
    }
    @GetMapping("/all")
    public List<Book> findAll() {
        Iterable<Book> result = bookRepository.findAll();
        Iterator<Book> res = result.iterator();
        List<Book> books = new ArrayList<>();
        while (res.hasNext()) {
            books.add(res.next());
        }
        log.info("List All, Size: {}", books.size());
        return books;
    }
    /**
     * 新增
     *
     * @param book
     * @return
     */
    @PostMapping("/")
    public Book create(@RequestBody Book book) {
        log.info("Saved OK: {}", book.getTitle());
        return bookRepository.save(book);
    }
    /**
     * 根据ID查询
     *
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    public Book findById(@PathVariable("id") String id) {
        log.info("Query ID: {}", id);
        Book orElse = bookRepository.findById(id).orElse(null);
        return orElse;
    }
    /**
     * 根据ID修改
     *
     * @param id
     * @param title
     * @param author
     * @param wordCount
     * @param publishDate
     * @return
     * Note: 报错:Failed to convert value of type 'java.lang.String' to required type 'java.time.LocalDateTime';
     * 解决:在参数前添加注解:@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     */
    @PutMapping("/{id}")
    public Book update(@PathVariable("id") String id,
                       @RequestParam(name = "title", required = false) String title,
                       @RequestParam(name = "author", required = false) String author,
                       @RequestParam(name = "wordCount", required = false) Integer wordCount,
                       @RequestParam(name = "publishDate", required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime publishDate) {
        Optional<Book> optional = bookRepository.findById(id);
        if (optional.isPresent()) {
            Book book = optional.get();
            if (title != null) {
                book.setTitle(title);
            }
            if (author != null) {
                book.setAuthor(author);
            }
            if (wordCount != null) {
                book.setWordCount(wordCount);
            }
            if (publishDate != null) {
                book.setPublishDate(publishDate);
            }
            return bookRepository.save(book);
        }
        return null;
    }
    /**
     * 根据ID删除
     *
     * @param id
     */
    @DeleteMapping("/{id}")
    public void delete(@PathVariable("id") String id) {
        log.info("Deleted ID: {}", id);
        bookRepository.deleteById(id);
    }
    /**
     * 删除所有
     */
    @PostMapping("/clear")
    public void clear() {
        log.info("Delete All!");
        bookRepository.deleteAll();
    }
    /**
     * 根据作者查询
     *
     * @param author
     * @return
     */
    @PostMapping("/author")
    public List<Book> byAuthor(String author) {
        log.info("By Author");
        return bookRepository.findByAuthor(author);
    }
    /**
     * 根据作者检索
     *
     * @param author
     * @return
     */
    @PostMapping("/author/like")
    public List<Book> byAuthorLike(String author) {
        log.info("By Author Like");
        return bookRepository.findByAuthorLike(author);
    }
    /**
     * 根据标题查询
     *
     * @param title
     * @return
     */
    @PostMapping("/title")
    public List<Book> byTitle(String title) {
        log.info("By Title");
        return bookRepository.findByTitle(title);
    }
    /**
     * 根据字数查询
     *
     * @param wordCount
     * @return
     */
    @GetMapping("/wordCount/{count}")
    public List<Book> byWordCount(@PathVariable("count") Integer wordCount) {
        log.info("By WordCount");
        return bookRepository.findByWordCount(wordCount);
    }
    /**
     * 根据作者与标题查询
     *
     * @param author
     * @param title
     * @return
     */
    @PostMapping("/query")
    public List<Book> byAuthorAndTitle(String author, String title) {
        log.info("By AuthorAndTitle");
        return bookRepository.findByAuthorAndTitle(author, title);
    }
    /**
     * 根据标题查询@Query
     *
     * @param title
     * @return
     */
    @PostMapping("/query/title")
    public List<Book> queryByTitle(String title) {
        log.info("Query By Title");
        return bookRepository.queryByTitle(title);
    }
}


相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。 &nbsp;
目录
相关文章
|
6月前
|
安全 Java Apache
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 身份和权限认证
本文介绍了 Apache Shiro 的身份认证与权限认证机制。在身份认证部分,分析了 Shiro 的认证流程,包括应用程序调用 `Subject.login(token)` 方法、SecurityManager 接管认证以及通过 Realm 进行具体的安全验证。权限认证部分阐述了权限(permission)、角色(role)和用户(user)三者的关系,其中用户可拥有多个角色,角色则对应不同的权限组合,例如普通用户仅能查看或添加信息,而管理员可执行所有操作。
258 0
|
6月前
|
安全 Java 数据安全/隐私保护
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 三大核心组件
本课程介绍如何在Spring Boot中集成Shiro框架,主要讲解Shiro的认证与授权功能。Shiro是一个简单易用的Java安全框架,用于认证、授权、加密和会话管理等。其核心组件包括Subject(认证主体)、SecurityManager(安全管理员)和Realm(域)。Subject负责身份认证,包含Principals(身份)和Credentials(凭证);SecurityManager是架构核心,协调内部组件运作;Realm则是连接Shiro与应用数据的桥梁,用于访问用户账户及权限信息。通过学习,您将掌握Shiro的基本原理及其在项目中的应用。
213 0
|
6月前
|
NoSQL Java 关系型数据库
微服务——SpringBoot使用归纳——Spring Boot 中集成Redis——Redis 介绍
本文介绍在 Spring Boot 中集成 Redis 的方法。Redis 是一种支持多种数据结构的非关系型数据库(NoSQL),具备高并发、高性能和灵活扩展的特点,适用于缓存、实时数据分析等场景。其数据以键值对形式存储,支持字符串、哈希、列表、集合等类型。通过将 Redis 与 Mysql 集群结合使用,可实现数据同步,提升系统稳定性。例如,在网站架构中优先从 Redis 获取数据,故障时回退至 Mysql,确保服务不中断。
232 0
微服务——SpringBoot使用归纳——Spring Boot 中集成Redis——Redis 介绍
|
2月前
|
缓存 JSON 前端开发
第07课:Spring Boot集成Thymeleaf模板引擎
第07课:Spring Boot集成Thymeleaf模板引擎
318 0
第07课:Spring Boot集成Thymeleaf模板引擎
|
3月前
|
前端开发
SpringBoot2.3.1集成Knife4j接口文档
SpringBoot2.3.1集成Knife4j接口文档
401 44
|
2月前
|
Java 关系型数据库 MySQL
springboot项目集成dolphinscheduler调度器 实现datax数据同步任务
springboot项目集成dolphinscheduler调度器 实现datax数据同步任务
262 2
|
2月前
|
分布式计算 Java 大数据
springboot项目集成dolphinscheduler调度器 可拖拽spark任务管理
springboot项目集成dolphinscheduler调度器 可拖拽spark任务管理
102 2
|
6月前
|
XML Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于 xml 的整合
本教程介绍了基于XML的MyBatis整合方式。首先在`application.yml`中配置XML路径,如`classpath:mapper/*.xml`,然后创建`UserMapper.xml`文件定义SQL映射,包括`resultMap`和查询语句。通过设置`namespace`关联Mapper接口,实现如`getUserByName`的方法。Controller层调用Service完成测试,访问`/getUserByName/{name}`即可返回用户信息。为简化Mapper扫描,推荐在Spring Boot启动类用`@MapperScan`注解指定包路径避免逐个添加`@Mapper`
205 0
|
2月前
|
存储 人工智能 Java
Springboot集成AI Springboot3 集成阿里云百炼大模型CosyVoice2 实现Ai克隆语音(未持久化存储)
本项目基于Spring Boot 3.5.3与Java 17,集成阿里云百炼大模型CosyVoice2实现音色克隆与语音合成。内容涵盖项目搭建、音色创建、音频合成、音色管理等功能,适用于希望快速掌握Spring Boot集成语音AI技术的开发者。需提前注册阿里云并获取API Key。
|
3月前
|
缓存 安全 Java
Shiro简介及SpringBoot集成Shiro(狂神说视频简易版)
Shiro简介及SpringBoot集成Shiro(狂神说视频简易版)
212 6

热门文章

最新文章