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

news2024/11/16 16:39:38

场景

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

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

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

注:

博客:
霸道流氓气质-CSDN博客

实现

1、ElastciSearch的对象映射

Spring Data Elasticsearch - Reference Documentation

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就是根据书名模糊搜索

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

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

Spring Data Elasticsearch - Reference Documentation

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、关于查询与扩展

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1386829.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SeaTunnel 海量数据同步工具的使用(连载中……)

一、概述 SeaTunnel 是一个非常易用&#xff0c;高性能、支持实时流式和离线批处理的海量数据处理产品&#xff0c;前身是 WaterDrop &#xff08;中文名&#xff1a;水滴&#xff09;&#xff0c;自 2021年10月12日更名为 SeaTunnel 。2021年12月9日&#xff0c;SeaTunnel 正式…

微服务原理

微服务篇 文章目录 微服务篇SpringCloud常见组件 Nacos篇下载源码导入Nacos源码proto编译protobuf定义安装protoc编译proto 运行Nacos服务服务注册服务注册接口客户端NacosServiceRegistryAutoConfigurationNacosAutoServiceRegistrationNacosServiceRegistryNacosNamingServic…

计算机二级Python基本排序题-序号43(补充)

1. 在一组单词中&#xff0c;查找出所有长度最长的单词&#xff0c;如果给定的一组单词是&#xff1a;“cad” ,“VB”.“Python” ,“MATLAB” , “hel1o” , “world” 则输出结果为&#xff1a;the longest words are: Python MATLAB def proc(strings): …

Leetcode1441.用栈操作构建数组

文章目录 题目原题链接思路代码 题目 给你一个数组 target 和一个整数 n。每次迭代&#xff0c;需要从 list { 1 , 2 , 3 …, n } 中依次读取一个数字。 请使用下述操作来构建目标数组 target &#xff1a; “Push”&#xff1a;从 list 中读取一个新元素&#xff0c; 并将其…

多视图多标签学习

一、多视图学习 多视图学习又称多视角学习&#xff0c;在实际应用问题中&#xff0c;对于同一事物可以从多种不同的途径或不同的角度进行描述&#xff0c;这些不同的描述构成了事物的多个视图。例如&#xff1a;在与人们生活息息相关的互联网中&#xff0c;网页数据既可以用网…

参与直播领取龙年大礼盒!23年Coremail社区年终福利大放送

2023年终福利大放送 Coremail 管理员社区是由 Coremail 邮件安全团队、服务团队及多条产品线共同维护&#xff0c;集 7*24h 在线自助查询、技术问答交流、大咖互动分享、资料下载等功能于一体&#xff0c;专属于 Coremail 邮件管理员、安全员成长互动的知识库社区。 转眼间&am…

RabbitMQ交换机(2)-Direct

1.Direct 直连(路由)交换机,生产者将消息发送到交换机&#xff0c;并指定消息的Routing Key&#xff08;路由键&#xff09;。交换机会将Routing Key与队列绑定进行匹配&#xff0c;如果匹配成功&#xff0c;则将该消息路由到对应的队列中。如果没有匹配成功&#xff0c;该消息…

统计学-R语言-4.6

文章目录 前言列联表条形图及其变种---单式条形图条形图及其变种---帕累托图条形图及其变种---复式条形图条形图及其变种---脊形图条形图及其变种---马赛克图饼图及其变种---饼图饼图及其变种---扇形图直方图茎叶图箱线图小提琴图气泡图总结 前言 本篇文章是对数据可视化的补充…

利用fd子系统实现图案与图片显示方法

//第一&#xff1a;利用fb子系统画圆的方法与实现 //1、头文件信息 #include <sys/ioctl.h> #include <linux/fb.h> #include <stdio.h> #include <sys/types.h> #include <stdio.h> #include <sys/mman.h> #include <sys/types.h>…

欧姆龙plc学习NJ系列CJ系列资料Sysmac Studio编程软件视频教程

Sysmac Studio是欧姆龙公司开发的一款集成开发环境&#xff08;IDE&#xff09;&#xff0c;用于编程和配置欧姆龙PLC&#xff08;可编程逻辑控制器&#xff09;和其他自动化设备。Sysmac Studio支持以下型号的欧姆龙PLC&#xff1a;1. NJ系列&#xff1a;NJ501、NJ301、NJ101、…

循环冗余校验(Cyclic Redundancy Check, CRC)计算

若信息码字为111000110&#xff0c;生成多项式G(x)x^5x^3x1&#xff0c;则计算出的CRC校验码为&#xff08; &#xff09;。 A.01101 B.11001 C.001101 D.011001 循环冗余校验(Cyclic Redundancy Check, CRC)是一种根据网络数据包或电脑文件等数据产生简短固定位数校验码的…

【数据库和表的管理】

数据库和表的管理 一、实验目的 了解MySQL数据库的逻辑结构和物理结构的特点。学会使用SQL语句创建、选择、删除数据库。学会使用SQL语句创建、修改、删除表。学会使用SQL语句对表进行插入、修改和删除数据操作。了解MySQL的常用数据类型。 二、实验内容SQL语句创建、选择、删…

多维时序 | Matlab实现GRO-CNN-LSTM-Attention淘金算法优化卷积神经网络-长短期记忆网络结合注意力机制多变量时间序列预测

多维时序 | Matlab实现GRO-CNN-LSTM-Attention淘金算法优化卷积神经网络-长短期记忆网络结合注意力机制多变量时间序列预测 目录 多维时序 | Matlab实现GRO-CNN-LSTM-Attention淘金算法优化卷积神经网络-长短期记忆网络结合注意力机制多变量时间序列预测效果一览基本介绍程序设…

vivado 使用Vitis HLS源、使用模型生成器源、使用系统生成器源

使用Vitis HLS源 AMD Vitis™ 高级综合&#xff08;HLS&#xff09;工具将C规范转换为寄存器传输级&#xff08;RTL&#xff09;实现&#xff0c;您可以将其合成到AMD设备中。你可以写CC、C或SystemC中的规范&#xff0c;AMD设备提供了大规模并行与传统处理器相比&#xff0c;…

Android的setContentView流程

一.Activity里面的mWindow是啥 在ActivityThread的performLaunchActivity方法里面&#xff1a; private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {ActivityInfo aInfo r.activityInfo;if (r.packageInfo null) {r.packageInfo getP…

11 # 类:抽象类与多态

抽象类 抽象类是不允许被实例化的&#xff0c;只能被继承 abstract class Animal {}let animal new Animal(); // 错误: 不能创建一个抽象类的实例 class Dog {constructor(name: string) {this.name name;}name: string;run() {} }let dog new Dog(Tom);抽象类的好处就…

【野火i.MX6NULL开发板】ARM-GCC 和开发板的 HelloWorld(ubuntu主机和野火开发板debian交叉编译)、开发板的/mnt里没文件

0、前言 参考资料&#xff1a; 《野火 Linux 基础与应用开发实战指南基于 i.MX6ULL 系列》PDF 第24章 参考视频&#xff1a; https://www.bilibili.com/video/BV1JK4y1t7io?p26&vd_sourcefb8dcae0aee3f1aab700c21099045395 注意&#xff0c;一定要记得把虚拟机的网络适配…

【扩散模型】10、ControlNet | 用图像控制图像的生成(ICCV2023)

论文&#xff1a;Adding Conditional Control to Text-to-Image Diffusion Models 代码&#xff1a;https://github.com/lllyasviel/ControlNet 出处&#xff1a;ICCV2023 Best Paper | 斯坦福 时间&#xff1a;2023.02 一、背景 文本到图像的生成尽管已经有很好的效果&…

拦截器的配置

1、什么是拦截器&#xff1f; Spring MVC中的拦截器&#xff08;Interceptor&#xff09;类似于Servlet中的过滤器&#xff08;Filter&#xff09;&#xff0c;它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、判断用户是否登录等。 拦截器依赖于web框…

Git仓库管理笔记

问题&#xff1a; hint: the same ref. If you want to integrate the remote changes, use Done 解决&#xff1a; 解决方法&#xff1a; 1、先使用pull命令&#xff1a; git pull --rebase origin master 2、再使用push命令&#xff1a; git push -u origin master