【Elasticsearch】spring-boot-starter-data-elasticsearch的使用以及Elasticsearch集群的连接

news2024/12/25 9:08:16

更多有关博主写的往期Elasticsearch文章

标题地址
【ElasticSearch 集群】Linux安装ElasticSearch集群(图文解说详细版)https://masiyi.blog.csdn.net/article/details/131109454
基于SpringBoot+ElasticSearch 的Java底层框架的实现https://masiyi.blog.csdn.net/article/details/121534307
ElasticSearch对标Mysql,谁能拔得头筹?https://masiyi.blog.csdn.net/article/details/122661822
同事说关键字查询用Mysql,我上去就是一个高压锅,用ElasticSearch不香吗?https://masiyi.blog.csdn.net/article/details/122701654
新年第一天,老板让升级ElasticSearch版本,我说得加钱https://masiyi.blog.csdn.net/article/details/122819455
使用了ElasticSearch之后,公司系统查询速度快了50倍,工资直接翻一倍https://masiyi.blog.csdn.net/article/details/122819455
ElasticSearch实战教程PostMan版(超级详细版)https://masiyi.blog.csdn.net/article/details/123048119
Linux安装ElasticSearch以及Ik分词器(图文解说详细版)https://masiyi.blog.csdn.net/article/details/121509681

文章目录

    • 🐝第一步,创建一个springboot项目
    • 🐝第二步,导入spring-boot-starter-data-elasticsearch依赖
    • 🐝第三步,配置yml文件
    • 🐝第四步,编写es索引对应的实体类
    • 🐝第五步,编写实体类对应的mapper
    • 🐝第六步,使用框架自带的增删改查
      • 🐝增
        • 🐝使用ElasticsearchRestTemplate
        • 🐝使用mapper
        • 🐝设置指定的id
        • 🐝批量保存
      • 🐝删
        • 🐝传入实体类删
        • 🐝传入id删
        • 🐝删除索引里面所有的数据(慎用)
      • 🐝改
        • 🐝实体改
        • 🐝实体改全部
        • 🐝先查再update
        • 🐝直接使用局部更新
      • 🐝查
        • 🐝根据id查
        • 🐝根据id列表查
        • 🐝查询全部数据
        • 🐝排序查-正序
        • 🐝排序查-倒序
        • 🐝分页查
        • 🐝自定义复杂的查询
    • 🐝第七步,使用JPA风格的查询方式
        • 🐝根据age查询
        • 🐝查询所有符合age的数据
        • 🐝查询最top的数据

导语

发现很多公司都是自己导入原生的jar包自己去封装一套Elasticsearch的框架,这样虽然可以自定义业务,但是需要花费很多的时间,其实spring官方有一套springboot的starter,帮助大家快速入手官网的starter,这篇博客也会介绍使用该starter连接Elasticsearch的集群。该starter有点像mybatisplus+Jpa,如果熟悉这两个框架的同学应该很快就会上手。

官网地址:
https://docs.spring.io/spring-data/elasticsearch/docs/4.0.x/reference/html/#preface

本文所有的代码都已经提交到git仓库中,仓库地址:
https://gitee.com/WangFuGui-Ma/spring-boot-elasticSearch

在这里插入图片描述

现在我们开始按照步骤进行spring-boot-starter-data-elasticsearch的使用,本文中使用的spring boot版本为2.7.x 对于的elasticsearch客户端版本为7.17.x

🐝第一步,创建一个springboot项目

在这里插入图片描述

🐝第二步,导入spring-boot-starter-data-elasticsearch依赖

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

其他依赖

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

		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<!--json-->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.2.76</version>
		</dependency>
		<!--json-->

在这里插入图片描述

🐝第三步,配置yml文件

spring:
  elasticsearch:
    uris:
      - 192.168.75.128:9200
      - 192.168.75.129:9200
      - 192.168.75.130:9200
server:
  port: 8889

uris这里填的是集群的地址,如果你的es是单机版的,直接填一个就行了

🐝第四步,编写es索引对应的实体类

import lombok.Data;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.WriteTypeHint;

/**
 * @Author masiyi
 * @Date 2023/6/14 13:46
 * @PackageName:com.masiyi.springbootstarterdataelasticsearch.doman
 * @ClassName: ElasticTest
 * @Description: TODO
 * @Version 1.0
 */
@Data
@Document(indexName = "elastic_test",writeTypeHint = WriteTypeHint.FALSE)
public class ElasticTest {

    private Long id;

    private String name;

    private Integer age;

    private Boolean isMan;
}

注:

  • id这个类型一定要写,否则会报错
  • indexName对应es中的索引
  • writeTypeHint如果为false则不会自动创建索引

🐝第五步,编写实体类对应的mapper

类似mybatis一样,我们需要创建对应的mapper

public interface ElasticTestMapper extends ElasticsearchRepository<ElasticTest,Long> {

}

继承ElasticsearchRepository类,第一个泛型添es对应的实体类,第二个泛型添id的类型

🐝第六步,使用框架自带的增删改查

我们这次用单元测试的方法跟大家演示框架的用法

在这里插入图片描述

注入刚刚创建的mapper和框架的ElasticsearchRestTemplate

🐝增

🐝使用ElasticsearchRestTemplate

   @Test
    void save() {
        ElasticTest elasticTest = new ElasticTest();
        elasticTest.setName("李四");
        elasticTest.setAge(23);
        elasticTest.setIsMan(true);
        elasticsearchTemplate.save(elasticTest);
    }

🐝使用mapper

    @Test
    void insert() {
        ElasticTest elasticTest = new ElasticTest();
        elasticTest.setName("李四");
        elasticTest.setAge(23);
        elasticTest.setIsMan(true);
        elasticTestMapper.save(elasticTest);
    }

🐝设置指定的id

   @Test
    void insertId() {
        ElasticTest elasticTest = new ElasticTest();
        elasticTest.setName("掉头发的王富贵");
        elasticTest.setAge(25);
        elasticTest.setIsMan(true);
        elasticTest.setId(2434235L);
        elasticTestMapper.save(elasticTest);
    }

🐝批量保存

    @Test
    void saveAll() {
        ElasticTest elasticTest = new ElasticTest();
        elasticTest.setName("李四");
        elasticTest.setAge(24);
        elasticTest.setIsMan(true);
        elasticTestMapper.saveAll(Arrays.asList(elasticTest));
    }

🐝删

🐝传入实体类删

    @Test
    void delete() {
        ElasticTest elasticTest = new ElasticTest();
        elasticTest.setId(2342342L);
        elasticTestMapper.delete(elasticTest);
    }

🐝传入id删

    @Test
    void deleteById() {
        elasticTestMapper.deleteById(2342342L);
    }

🐝删除索引里面所有的数据(慎用)

    @Test
    void deleteAll() {
        elasticTestMapper.deleteAll();
    }

🐝改

🐝实体改

    @Test
    void update() {
        ElasticTest elasticTest = new ElasticTest();
        elasticTest.setName("掉头发的王富贵hh");
        elasticTest.setId(2434235L);
        elasticTestMapper.save(elasticTest);
    }

这里改会把其他的不在实体里面为null的数据清空

在这里插入图片描述

🐝实体改全部

 @Test
    void updateAll() {
        ElasticTest elasticTest = new ElasticTest();
        elasticTest.setName("掉头发的王富贵");
        elasticTest.setAge(24);
        elasticTest.setIsMan(true);
        elasticTest.setId(2434234L);
        elasticTestMapper.save(elasticTest);
    }

如果我们只需要局部更新,可以使用下面的两种方法

🐝先查再update

    @Test
    void updateNow() {
        ElasticTest elasticTest = elasticTestMapper.findById(2434234L).get();
        elasticTest.setName("不掉头发的王富贵");
        elasticTestMapper.save(elasticTest);
    }

但是这个方法会消耗性能,所以推荐用下面的方法

🐝直接使用局部更新

    @Test
    void updateNow2() {
        ElasticTest elasticTest = new ElasticTest();
        elasticTest.setName("掉头发的王富贵h");
        Map map = JSONObject.parseObject(JSONObject.toJSONString(elasticTest), Map.class);
        UpdateQuery updateQuery = UpdateQuery.builder("0ZUv7okBcQy9f7u_tXkH").withDocument(Document.from(map)).build();
        elasticsearchTemplate.update(updateQuery, IndexCoordinates.of("elastic_test"));
    }

在这里插入图片描述

🐝查

🐝根据id查

    @Test
    void select() {
        Optional<ElasticTest> byId = elasticTestMapper.findById(2434234L);
        byId.ifPresent(System.out::println);
    }

🐝根据id列表查

  @Test
    void findAllById() {
        Iterable<ElasticTest> allById = elasticTestMapper.findAllById(Arrays.asList(2434234L));
        allById.forEach(System.out::println);
    }

🐝查询全部数据

    @Test
    void findAll() {
        Iterable<ElasticTest> allById = elasticTestMapper.findAll();
        allById.forEach(System.out::println);
    }

🐝排序查-正序

    @Test
    void findAllSort() {
        Sort age = Sort.by("age").ascending();
        Iterable<ElasticTest> all = elasticTestMapper.findAll(age);
        all.forEach(System.out::println);
    }

🐝排序查-倒序

    @Test
    void findAllSortDE() {
        Sort age = Sort.by("age").descending();
        Iterable<ElasticTest> all = elasticTestMapper.findAll(age);
        all.forEach(System.out::println);
    }

🐝分页查

    @Test
    void findAllPage() {
        PageRequest pageRequest = PageRequest.of(0, 10);
        Page<ElasticTest> all = elasticTestMapper.findAll(pageRequest);
        all.forEach(System.out::println);
        System.out.println(JSON.toJSONString(all));
    }

🐝自定义复杂的查询

 @Test
    void findMyStyle() {
        TermQueryBuilder termQueryBuilder = new TermQueryBuilder("name.keyword", "掉头发的王富贵");
        NativeSearchQuery nativeSearchQuery = new NativeSearchQuery(termQueryBuilder);

        SearchHits<ElasticTest> search = elasticsearchTemplate.search(nativeSearchQuery, ElasticTest.class);
        List<SearchHit<ElasticTest>> hitList = search.getSearchHits();
        for (SearchHit<ElasticTest> hit : hitList) {
            ElasticTest entity = hit.getContent(); // 获取实体对象
            System.out.println(entity);
            String index = hit.getIndex(); // 获取索引名
            System.out.println(index);

        }
    }

🐝第七步,使用JPA风格的查询方式

如果会用jpa的同学看到这个可能会非常得熟悉

在这里插入图片描述
可以自定义查询方法find...

🐝根据age查询

    ElasticTest findByAge(Integer age);

🐝查询所有符合age的数据

    List<ElasticTest> findAllByAge(Integer age);

🐝查询最top的数据

    ElasticTest findTopByAge(Integer age);

如果你使用的是idea这种高级的编辑器,你在mapper写方法的时候会自动提示你。

在这里插入图片描述

通过本文的学习,我们探索了在Spring Boot应用中使用Elasticsearch的方法以及如何连接到Elasticsearch集群。Elasticsearch作为一款强大的搜索和分析引擎,在现代应用开发中扮演着至关重要的角色。借助于Spring Boot和spring-boot-starter-data-elasticsearch,我们能够以更加便捷的方式将Elasticsearch集成到我们的项目中,实现高效的数据搜索与分析。

通过配置简单明了的属性,我们能够快速地将Spring Boot应用连接到Elasticsearch集群,实现数据的索引、搜索和分析。借助于Spring Data Elasticsearch提供的强大功能,我们能够轻松地定义实体类、进行CRUD操作,并且利用Elasticsearch的全文搜索和分词等特性,让我们的应用具备更高效的查询和检索能力。

在这里插入图片描述

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

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

相关文章

如何在 Elasticsearch 中将矢量搜索与过滤结合起来 - Python 8.x

大型语言模型&#xff08;LLM&#xff09;每天都在发展&#xff0c;这种情况有助于语义搜索的扩展。 LLM 擅长分析文本和揭示语义相似性。 这种情况也反映在搜索引擎上&#xff0c;因为语义搜索引擎可以为用户提供更满意的结果。 尽管大型语言模型可以捕获语义上接近的结果&am…

zabbix整合prometheus的数据

1 zabbix安装 官方文档参考 https://www.zabbix.com/download?zabbix6.0&os_distributioncentos&os_version7&componentsproxy&dbmysql&ws https://www.zabbix.com/download?zabbix4.0&os_distributioncentos&os_version7&componentsserver…

【抖音直播小玩法】介绍

一、是什么 直播小玩法是基于抖音直播场景的新型实时互动内容。直播小玩法由开发者自主开发&#xff0c;接入平台并开放给抖音主播挂载使用。开发者提供创意&#xff0c;依托平台生态&#xff0c;获取收益。 介入标准&#xff1a; 企业开发者&#xff0c;暂不支持个人开发者…

8.文件存储空间管理

第四章 文件管理 8.文件存储空间管理 空闲表法&#xff1a;   空闲盘块表和在内存管理的动态分区分配中学习过的空闲分区表是类似的&#xff0c;空闲盘块表记录了每一个空闲区间的起始位置和这个空闲区间的长度这两个信息。像第一个空闲区间是0&#xff0c;1这两个空闲块&am…

【克罗恩病是银屑病及银屑病关节炎的因果风险因素】

克罗恩病是银屑病及银屑病关节炎的因果风险因素 ①纳入463372名欧洲人&#xff0c;包括12882例IBD患者、5621例银屑病患者、2063例银屑病关节炎患者&#xff1b;②单变量孟德尔随机化&#xff08;MR&#xff09;分析表明&#xff0c;基于遗传因素预测的IBD与较高的银屑病和银屑…

复数混频器、零中频架构和高级算法开发

文章里讲解了关于射频IQ调制器、零中频架构相关的原理及技术&#xff0c;全都是干货&#xff01;其实好多同行对软件无线电的原理、IQ调制、镜像抑制都是一知半解&#xff0c;知其然不知其所以然。好好研读这篇文章&#xff0c;相信会让你有种恍然大悟的感觉。 RF工程常被视为…

【Selenium学习】环境搭建 API学习

目录 一、javaSelenium的环境搭建&#xff1f; 二、认识Selenium 1、什么是自动化&#xff1f; 2、什么是Selenium? (重点) 3、selenium的工作原理&#xff1f;&#xff08;重点&#xff09; 三、Selenium操作元素API&#xff08;重点&#xff09; 第一部分&#…

【数据结构OJ题】合并两个有序链表

原题链接&#xff1a;https://leetcode.cn/problems/merge-two-sorted-lists/description/ 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 可以先创建一个空链表&#xff0c;然后依次从两个有序链表中选取最小的进行尾插操作。&#xff08;有点类似双…

【数据结构OJ题】环形链表

原题链接&#xff1a;https://leetcode.cn/problems/linked-list-cycle/description/ 1. 题目描述 2. 思路分析 整体思路&#xff1a;定义快慢指针fast&#xff0c;slow&#xff0c;如果链表确实有环&#xff0c;fast指针一定会在环内追上slow指针。 即慢指针一次走一步&…

分布式 | 如何搭建 DBLE 的 JVM 指标监控系统

本篇文章采用 Docker 方式搭建 Grafana Prometheus 实现对 DBLE 的 JVM 相关指标的监控系统。 作者&#xff1a;文韵涵 爱可生 DBLE 团队开发成员&#xff0c;主要负责 DBLE 需求开发&#xff0c;故障排查和社区问题解答。 本文来源&#xff1a;原创投稿 爱可生开源社区出品&a…

“开发和运维”只是一个开始,最终目标是构建高质量的软件工程

随着技术的飞速发展&#xff0c;软件行业不断寻求改进和创新的方法来提供更高质量的产品。在这方面&#xff0c;DevOps已经展现出了巨大的潜力。通过打破开发和运维之间的壁垒&#xff0c;DevOps将持续集成、持续交付和自动化流程引入到软件开发中&#xff0c;使团队能够更快地…

PSP - 开源可训练的蛋白质结构预测框架 OpenFold 的环境配置

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132334671 Paper: OpenFold: Retraining AlphaFold2 yields new insights into its learning mechanisms and capacity for generalization Open…

循环队列的实现(c语言)

前言 循环队列是队列的一种特殊的结构&#xff0c;在生产者——消费者模型中常常使用它&#xff0c; 它在逻辑上是一个环形的连续的结构。在物理可以使用数组来实现。 目录 1.循环队列的逻辑结构 2.空的循环队列和满的循环队列 3.循环队列插入和删除 4.代码实现 …

关于小程序收集用户手机号行为的规范

手机号在日常生活中被广泛使用&#xff0c;是重要的用户个人信息&#xff0c;小程序开发者应在用户明确同意的前提下&#xff0c;依法合规地处理用户的手机号信息。 而部分开发者在处理用户手机号过程中&#xff0c;存在不规范收集行为&#xff0c;影响了用户的正常使用体验&a…

如何使用ChatGPT创建个性化的健身锻炼计划

ChatGPT广泛应用于各个行业&#xff0c;健身也不例外。 ChatGPT 在健身领域的一个常用案例是创建个性化的锻炼计划。 在要求 ChatGPT 创建锻炼计划时&#xff0c;简单地输入自己的目标和当前的健身水平是一个很好的开始。完成此操作后&#xff0c;你还可以使用其他提示和措施来…

视频汇聚集中存储EasyCVR平台调用iframe地址视频无法播放,该如何解决?

安防监控视频汇聚平台EasyCVR基于云边端一体化架构&#xff0c;具有强大的数据接入、处理及分发能力&#xff0c;可提供视频监控直播、云端录像、视频云存储、视频集中存储、视频存储磁盘阵列、录像检索与回看、智能告警、平台级联、云台控制、语音对讲、AI算法中台智能分析无缝…

Git 删除 GitHub仓库的文件

新建文件夹 git bash here 在新建的文件夹里右键git bash here打开终端&#xff0c;并执行git init初始化仓库 git clone <你的地址> 找到github上要删除的仓库地址&#xff0c;并复制&#xff0c;在终端里输入git clone <你的地址> 要删除文件的库里右键git b…

使用 Apache Kafka 和 Go 将数据引入 OpenSearch

需要编写自定义集成层来满足数据管道中的特定要求&#xff1f;了解如何使用 Go 通过 Kafka 和 OpenSearch 实现此目的。 可扩展的数据摄取是OpenSearch等大规模分布式搜索和分析引擎的一个关键方面。构建实时数据摄取管道的方法之一是使用Apache Kafka。它是一个开源事件流平台…

Ceph如何操作底层对象数据

1.基本原理介绍 1.1 ceph中的对象(object) 在Ceph存储中&#xff0c;一切数据最终都会以对象(Object)的形式存储在硬盘&#xff08;OSD&#xff09;上&#xff0c;每个的Object默认大小为4M。 通过rados命令&#xff0c;可以查看一个存储池中的所有object信息&#xff0c;例如…

配资平台app(正规股票配资软件)架构是怎么搭建的?

随着股票市场的发展&#xff0c;越来越多的投资者开始尝试使用股票配资平台进行杠杆炒股&#xff0c;因此&#xff0c;搭建一套稳定、可靠的配资平台app架构显得尤为重要。本文将介绍配资平台app架构设计的关键要素&#xff0c;以及建立一个正规的配资平台app所需考虑的问题。 …