首页 > 其他分享 >SpringBoot中整合ElasticSearch实现增删改查等操作

SpringBoot中整合ElasticSearch实现增删改查等操作

时间:2024-01-15 16:26:33浏览次数:24  
标签:ElasticBook SpringBoot void 改查 id book ElasticSearch import public

场景

SpringBoot中整合ElasticSearch快速入门以及踩坑记录:

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/135599698

在上面进行集成的基础上,实现对ES数据的增删改查等操作。

注:

博客:
https://blog.csdn.net/badao_liumang_qizhi

实现

1、ElastciSearch的对象映射

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

Spring Data Elasticsearch 对象映射是将 Java 对象(域实体)映射到存储在 Elasticsearch 中的 JSON 表示并返回的过程。

可用注解参考官网明细:

@Document:在类级别应用,以指示此类是映射到数据库的候选项。 最重要的属性是:

indexName:要存储此实体的索引的名称。 这可以包含一个 SpEL 模板表达式,例如"log-#{T(java.time.LocalDate).now().toString()}"

type:映射类型。 如果未设置,则使用类的小写简单名称。(自 4.0 版起已弃用)

shards:索引的分片数。

replicas:索引的副本数。

refreshIntervall:索引的刷新间隔。 用于创建索引。 默认值为“1s”。

indexStoreType:索引的索引存储类型。 用于创建索引。 默认值为“fs”。

createIndex:标记是否在存储库引导时创建索引。 默认值为 true。 请参阅使用相应映射自动创建索引

versionType:版本管理的配置。 默认值为 EXTERNAL。

@Id:在字段级别应用以标记用于标识目的的字段。

@Transient:默认情况下,所有字段在存储或检索文档时都映射到文档,此注释不包括该字段。

@PersistenceConstructor:标记给定的构造函数(甚至是受包保护的构造函数)以在从数据库实例化对象时使用。 构造函数参数按名称映射到检索到的 Document 中的键值。

@Field:应用于字段级别并定义字段的属性,大部分属性映射到相应的 Elasticsearch Mapping 定义(以下列表不完整,请查看注解 Javadoc 以获取完整参考):

name:将在 Elasticsearch 文档中表示的字段名称,如果未设置,则使用 Java 字段名称。

type:字段类型,可以是 Text、Keyword、Long、Integer、Short、Byte、Double、Float、Half_Float、Scaled_Float、Date、Date_Nanos、Boolean、Binary、Integer_Range、Float_Range、Long_Range、Double_Range、Date_Range、Ip_Range、Object、Nested、Ip、TokenCount、Percolator、Flattened、Search_As_You_Type之一。 请参阅 Elasticsearch 映射类型

format以及 Date 类型的定义。pattern

store:标记是否应将原始字段值存储在 Elasticsearch 中,默认值为 false。

analyzer、 ,用于指定自定义分析器和规范化程序。searchAnalyzernormalizer

@GeoPoint:将字段标记为geo_point数据类型。 如果字段是类的实例,则可以省略。GeoPoint

当然也可以自定义转换规则:

 

按照以上注解说明,新建实体类

import lombok.AllArgsConstructor;
import lombok.Builder;
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="books",createIndex = true)
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ElasticBook {
    @Id
    private Integer id;

    @Field(type = FieldType.Text)
    private String name;

    @Field(type = FieldType.Text)
    private String summary;

    @Field(type = FieldType.Integer)
    private Integer price;
}

这里createIndex 默认就是true,可以不写,代表如果索引不存在则创建。

2、增删改查实现

新建接口Repository,使其继承ElasticsearchRepository

import com.ruoyi.system.domain.study.ElasticBook;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;
import java.util.List;

@Repository
public interface ElasticSearchRepository extends ElasticsearchRepository<ElasticBook,Integer> {
    List<ElasticBook> findByName(String name);
}

则可以直接使用其自带的各种方法

 

也可以自定义方法,比如findByName就是根据书名模糊搜索

自定义派生的方法不用实现,只要符合其关键字和规则可自动实现。

这块可参考官网从方法名称创建查询说明:

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

 

3、新建Service接口

import java.util.List;

public interface IElasticSearchService {

    void save(ElasticBook book);

    ElasticBook findById(Integer id);

    void update(ElasticBook book);

    void deleteById(Integer id);

    List<ElasticBook> findByName(String name);
}

4、新建service实现

import com.ruoyi.system.repository.ElasticSearchRepository;
import com.ruoyi.system.service.IElasticSearchService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class ElasticSearchServiceImpl implements IElasticSearchService {

    @Autowired
    private ElasticSearchRepository repository;

    @Override
    public void save(ElasticBook book) {
        repository.save(book);
    }

    @Override
    public ElasticBook findById(Integer id) {
        return repository.findById(id).get();
    }

    @Override
    public void update(ElasticBook book) {
        repository.save(book);
    }

    @Override
    public void deleteById(Integer id) {
        repository.deleteById(id);
    }

    @Override
    public List<ElasticBook> findByName(String name) {
        return repository.findByName(name);
    }
}

5、编写单元测试

@RunWith(SpringRunner.class)
@SpringBootTest(classes = RuoYiApplication.class,webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class ElasticSearchTest {

    @Autowired
    @Qualifier("elasticsearchClient")
    public RestHighLevelClient highLevelClient;

    @Autowired
    private IElasticSearchService iElasticSearchService;

    @Test
    public void connecTest() throws IOException {
        CreateIndexRequest request = new CreateIndexRequest("test");
        CreateIndexResponse response = highLevelClient.indices().create(request, RequestOptions.DEFAULT);
        // 查看是否创建成功
        System.out.println(response.isAcknowledged());
        highLevelClient.close();
    }

    //保存
    @Test
    public void saveTest() throws IOException {
        ElasticBook book = ElasticBook.builder().id(1).name("书名1").summary("霸道的程序猿").price(100).build();
        iElasticSearchService.save(book);
        highLevelClient.close();
        System.out.println("保存成功");
    }

    //根据主键查询
    @Test
    public void findTest() throws IOException {
        ElasticBook book = ElasticBook.builder().id(2).name("书名2").summary("霸道的程序猿").price(80).build();
        iElasticSearchService.save(book);
        ElasticBook book1 = iElasticSearchService.findById(2);
        highLevelClient.close();
        System.out.println("查询成功");
        System.out.println(book1);
    }

    //根据主键更新
    @Test
    public void updateTest() throws IOException {
        ElasticBook book = ElasticBook.builder().id(2).name("书名2更新").summary("霸道的程序猿").price(80).build();
        iElasticSearchService.update(book);
        ElasticBook book1 = iElasticSearchService.findById(2);
        highLevelClient.close();
        System.out.println("更新成功");
        System.out.println(book1);
    }

    //根据主键删除
    @Test
    public void deleteTest() throws IOException {
        iElasticSearchService.deleteById(1);
        highLevelClient.close();
        System.out.println("删除成功");
    }

    //派生查询
    @Test
    public void findByNameTest() throws IOException {
        List<ElasticBook> bookList = iElasticSearchService.findByName("书名");
        highLevelClient.close();
        System.out.println("查询成功");
        System.out.println(bookList);
    }
}

6、单元测试运行结果

保存结果

 

根据主键查询结果

 

更新结果

 

模糊搜索

 

7、关于查询与扩展

通过上面简单入门后,关于查询还有计数、排序、分页、条件等高级用法,这里可以在需要用到时再查询官方文档查看

 

标签:ElasticBook,SpringBoot,void,改查,id,book,ElasticSearch,import,public
From: https://www.cnblogs.com/badaoliumangqizhi/p/17965605

相关文章

  • SpringBoot中整合ElasticSearch快速入门以及踩坑记录
    场景若依前后端分离版手把手教你本地搭建环境并运行项目:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/108465662参考上面搭建项目。ElaticSearchElasticsearch是java开发的,基于Lucene的搜索引擎。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTfulW......
  • SpringBoot 项目打成jar包并部署
    #打包在SpringBoot的pom文件中加入下列代码```XML<build><!--<finalName>census</finalName>--><plugins><plugin><groupId>org.springframework.boot</groupId><ar......
  • SpringBoot 2.x 正式停更了。Java 8 就看 Solon 的了!
    最近有好多个新闻说:SpringBoot2.x正式停更了,Java8怎么办?当然用Solon喽!Solon,同时支持jdk8,jdk11,jdk17,jdk21。也支持graalvmnativeimage。既支持java8,也支持java21的:@SolonMainpublicclassApp{publicstaticvoidmain(String[]args){Sol......
  • SpringBoot动态权限校验,常用的实现方案
    SpringBoot.pngSpringBoot是由Pivotal团队提供的一套开源框架,可以简化spring应用的创建及部署。它提供了丰富的Spring模块化支持,可以帮助开发者更轻松快捷地构建出企业级应用。SpringBoot通过自动配置功能,降低了复杂性,同时支持基于JVM的多种开源框架,可以缩短开发时间,使开发更......
  • ElasticSearch降本增效常见的方法 | 京东云技术团队
    Elasticsearch在db_ranking的排名不断上升,其在存储领域已经蔚然成风且占有非常重要的地位。随着Elasticsearch越来越受欢迎,企业花费在ES建设上的成本自然也不少。那如何减少ES的成本呢?今天我们就特地来聊聊ES降本增效的常见方法:弹性伸缩分级存储其他:(1)数据压缩(2)off......
  • ElasticSearch降本增效常见的方法 | 京东云技术团队
    Elasticsearch在db_ranking的排名不断上升,其在存储领域已经蔚然成风且占有非常重要的地位。随着Elasticsearch越来越受欢迎,企业花费在ES建设上的成本自然也不少。那如何减少ES的成本呢?今天我们就特地来聊聊ES降本增效的常见方法:弹性伸缩分级存储其他:(1)数据压缩(2)offheap1弹性伸缩......
  • SpringBoot enter door基础_配springBoot项目,读取配置,配置全局异常捕获
    1、Spring是重量级企业开发框架 EnterpriseJavaBean(EJB) 的替代品,Spring为企业级Java开发提供了一种相对简单的方法,通过 依赖注入 和 面向切面编程 ,用简单的 Java对象(PlainOldJavaObject,POJO) 实现了EJB的功能虽然Spring的组件代码是轻量级的,但它的配置却是重......
  • SpringBoot集成Kafka构建消息系统
    一、前言在我们当前的互联网应用中,消息驱动已经成为一种不可或缺的模式,Kafka作为一款高性能的分布式消息系统,已经成为很多公司在消息驱动架构选择中很重要的工具。我们使用SpringBoot和Kafka快速构建消息驱动应用,应对高并发的消息处理业务。Kafka是分布式发布-订阅消息系统。主要特......
  • 基于SpringBoot+Vue的OA办公系统设计实现(源码+lw+部署文档+讲解等)
    (文章目录)前言:heartpulse:博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌:heartpulse:......
  • 人脸识别系统【从0到1完成一个小项目】【6】【springboot快速上手】
    1.父类在pom.xml里面添加如上代码,有些会自动生成,没有生成的添加一下<parent><artifactId>spring-boot-starter-parent</artifactId><groupId>org.springframework.boot</groupId><version>2.7.6</version></parent>......