ES之三:springboot集成ES

news/2024/9/17 8:17:52/ 标签: elasticsearch, spring boot, 大数据

一.选择版本很重要,不然会找不到好多方法

明明有Timeout方法,不报红,运行时,报错,找不到该类 ClassNotFoundException

为了避免使用的Elasticsearch版本和SpringBoot采用的版本不一致导致的问题,尽量使用一致的版本。下表是对应关系:

在这里插入图片描述

Spring BootSpring Data ElasticsearchElasticsearch
2.4.x4.1.x7.9.x
2.5.x4.2.x7.12.x
2.6.x4.3.x7.15.x
2.7.x4.4.x7.17.x

我的项目用的 springboot-2.7.7
在这里插入图片描述

在这里插入图片描述

三、ES Java API选择

1、JAVA客户端对比
  • transportclient:通过监听9300端口tcp进行数据传输,它可以触摸到es的API和结构,此客户端对ES的版本兼容性较差,并且它在高并发环境下会有性能问题。

  • restclient:restclient就是采用http协议进行交互,它相比transportclient最大的好处就是对ES版本兼容性较好。restclient也分为high-level和low-level两种,两者原理基本一致,区别最大的就是封装性。low-level各种操作都要你自己封装,并且java本身不支持json还需要引用第三方包。而high-level是针对elasticsearch的api进行高级封装,和elasticsearch的版本关联大一些。

2、依赖选择
  • spring-data-elasticsearch:spring官方提供的框架,使用起来非常方便,3.2.0 版本之前是基于transportclient封装的,在此之后是基于HighLevelRestClient进行封装的,因此建议使用3.2.0 及以后的版本。

  • spring-boot-starter-data-elasticsearch:springboot官方提供的客户端,内部使用spring-data-elasticsearch,springboot-2.2(对应spring-data-elasticsearch-3.2.0)

3、该如何选择客户端?
  • 若使用的是springboot项目(spring-boot-starter-data-elasticsearch启动器),建议使用springboot-2.2及以后版本
  • 若只是一个普通spring项目,使用spring-data-elasticsearch-3.2.0以后版本。
  • 若以上两种都不是,建议使用HighLevelRestClient,而非transportclient
    在这里插入图片描述

四、实体映射

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDate;
import lombok.Data;
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;/*** 商品表* @TableName sys_model*/
@TableName(value ="sys_model")
@Data
@Document(indexName = "sys_model")
public class Model implements Serializable {/*** 主键*/@Id@TableId(value = "sys_id")@Field(type = FieldType.Keyword)private String sysId;/*** 对象Id*/@TableField(value = "object_id")@Field(type = FieldType.Keyword)private String objectId;/*** 商品订单号*/@TableField(value = "out_trade_no")@Field(type = FieldType.Keyword)private String outTradeNo;/*** 金额*/@TableField(value = "total_amount")@Field(type = FieldType.Keyword)private String totalAmount;/*** 商品名称*/@TableField(value = "subject")@Field(type = FieldType.Text)private String subject;/*** 是否支付 0 已支付 1未支付*/@TableField(value = "is_pay")@Field(type = FieldType.Integer)private Integer isPay;/*** 是否有效*/@TableField(value = "active")@Field(type = FieldType.Integer)private Integer active;/*** 创建时间*/@TableField(value = "create_time")@Field(type = FieldType.Date)private LocalDate createTime;/*** 修改时间*/@TableField(value = "update_time")@Field(type = FieldType.Date)private LocalDate updateTime;/*** 创建人*/@TableField(value = "create_by")@Field(type = FieldType.Keyword)private String createBy;/*** 修改然*/@TableField(value = "update_by")@Field(type = FieldType.Keyword)private String updateBy;@TableField(exist = false)private static final long serialVersionUID = 1L;
}

以下是对注释的讲解

@Document :
应用于类级别,表示该类是映射到数据库的候选对象。
重要属性:
indexName :存储此实体的索引名称,可包含 SpEL 模板表达式。
createIndex :标记在存储库引导中是否创建索引,默认值为 true 。
versionType :版本管理的配置,默认值为 EXTERNAL 。
@Id :
应用于字段级别,标记用于标识目的的字段。
@Transient :
应用于字段,默认情况下所有字段都映射到文档,该注释使此字段不被包含。
@PersistenceConstructor :
标记从数据库实例化对象时要使用的给定构造函数,参数按名称映射到检索到的文档中的键值。
@Field :
应用于字段级别,定义字段属性。
属性包括:
name :字段在 Elasticsearch 文档中的名称,未设置时使用 Java 字段名称。
type :字段类型,如多种类型可选。
format 和日期类型的 pattern :日期类型必须定义。
store :标记是否存储原始字段值,默认值为 false 。
analyzer 、 searchAnalyzer 、 normalizer :用于指定自定义分析和正规化。
@GeoPoint :
将字段标记为 geo_point 数据类型,若字段是 GeoPoint 类实例可省略。
@ValueConverter :
定义用于转换给定属性的类,仅转换带注释的属性。
@Setting :
定义不同的索引设置。
参数包括:
useServerConfiguration :不发送任何设置参数,由 Elasticsearch 服务器配置确定。
settingPath :指定义必须在类路径中解析的设置的 JSON 文件。
shards :要使用的分片数,默认为 1 。
replicas :副本数,默认为 1 。
refreshIntervall :默认为 1s 。
indexStoreType :默认为 fs 。

五、CRUD

主要有以下4个类

  • IndexOperations 在索引级别定义操作,例如创建或删除索引。
  • DocumentOperations 定义根据其ID存储,更新和检索实体的操作。
  • SearchOperations 定义使用查询搜索多个实体的动作
  • ElasticsearchOperations 结合DocumentOperations和SearchOperations的接口
  • ElasticsearchRestTemplate 是ElasticsearchOperations的实现类

日常使用时,使用ElasticsearchRestTemplate即可,代码如下

@Autowired
private ElasticsearchRestTemplate template;
1、操作索引
// 获取IndexOperations对象
IndexOperations indexOperations = template.indexOps(Model.class);
// 查
boolean exists = indexOperations.exists();
// 删
boolean delete = indexOperations.delete();
// 增
boolean flag = indexOperations.create();
// 设置Mapping
boolean mapping = indexOperations.putMapping();
2、条件搜索
使用 QueryBuilder 完成各种条件查询的示例@Testvoid getInfoByCondition() {// 创建一个 matchAllQueryQueryBuilder queryBuilder = QueryBuilders.matchAllQuery();// 条件查询:精确匹配QueryBuilder exactMatchQuery = QueryBuilders.termQuery("fieldName", "value");// 条件查询:范围匹配QueryBuilder rangeQuery = QueryBuilders.rangeQuery("numericField").from(10).to(20);// 条件查询:短语匹配QueryBuilder phraseMatchQuery = QueryBuilders.matchPhraseQuery("textField", "phrase");// 条件查询:布尔查询QueryBuilder boolQuery = QueryBuilders.boolQuery().must(QueryBuilders.termQuery("field1", "value1")).mustNot(QueryBuilders.termQuery("field2", "value2")).should(QueryBuilders.termQuery("field3", "value3"));// 条件查询:模糊匹配QueryBuilder fuzzyQuery = QueryBuilders.fuzzyQuery("fieldName", "value");// 将查询构建器添加到搜索源构建器中SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.query(queryBuilder);}~~~
# 六、ElasticsearchRepository
一个类似于Spring Data JPA的文档操作方法#### 1、新建一个Model的数据持久层

package com.elasticsearch.repository;

import com.elasticsearch.domain.Model;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;

/**

  • @Author:jackma
  • @name:ModelRepository
  • @Date:2024/7/20 22:36
    */
    @Repository
    public interface ModelRepository extends ElasticsearchRepository<Model,String> {
    }
    建立此持久层后,如果User实体@Document注解内的createIndex为true时(默认为true),则服务启动时会先检查索引是否存在,若不存在则会自动创建索引

2、默认的CRUD示例
// 增/改
Model model = new Model(1, “张三”, 18, “上海市闵行区”, LocalDateTime.now());
Model save = repository.save(model);

// 查
Optional optionalModel = repository.findById(1);

// 删
repository.deleteById(1);

————————————————

http://www.ppmy.cn/news/1521694.html

相关文章

高级算法设计与分析 学习笔记3 哈希表

首先我们要讨论一个把n个数据放到列表S里面的问题&#xff1a; 但很显然&#xff0c;这些数据的范围有多大这个T就得有多大&#xff0c;而实际上要放的数字可能就几个&#xff08;比如就放一个1和一个10000000&#xff0c;那我还是要准备一个巨大的T&#xff09;&#xff0c;不…

华为达芬奇人像引擎2.0,人像体验有哪些升级

对于年轻人而言&#xff0c;拍照已成为生活中不可或缺的一部分&#xff0c;不仅是为了记录世界、更重要的是成为生活的主角&#xff0c;大胆表达自己。然而很多喜欢使用手机记录生活的人&#xff0c;既希望能够实现媲美单反的影像实力&#xff0c;同时还想呈现出真实、更具自然…

利用机器人自动回复软件,显著提升客户体验

随着科技的飞速发展及互联网普及&#xff0c;机器人自动回复软件成为了现代企业的重要工具。无论是在客户服务领域&#xff0c;还是在营销、销售等方面&#xff0c;自动回复机器人都表现出了强大的功能和显著的效果。究竟什么是机器人自动回复技术?它是如何运行的?本文将为您…

懒加载<图片懒加载>

1、懒加载的概念 懒加载也叫做延迟加载、按需加载。指的是在长网页中延迟加载图片数据&#xff0c;是一种较好的网页性能优化的方式。 在比较长的网页或应用中&#xff0c;如果图片很多&#xff0c;所有的图片都被加载出来&#xff0c;而用户只能看到可视窗口的那一部分图片数…

基于Spring的Uniapp自动更新实现方法

Uniapp自动更新 本文介绍了基于rouyi-uniapp的更新包版本自动推送更新。结合minio和网址下载地址两种方式&#xff0c;计算版本号大小后&#xff0c;可选是否强制更新。 一、表结构和后端版本号检测设计 1、版本更新控制表结构 主要字段和设计思路&#xff1a; fileUrl&…

使用matplotlab绘制多条形图

##黑马程序学习 这种多个条形图放在一起的图形该怎么画呢&#xff1f; 请看以下代码 #横着的条形图 from matplotlib import pyplot as plt import matplotlib#设置显示中文 和 负号 matplotlib.rcParams[font.sans-serif][SimHei] matplotlib.rcParams[axes.unicode_minus]F…

学会这2招,让你轻松提取长视频中的文案!

在当今数字化时代&#xff0c;短视频已成为备受欢迎的内容形式&#xff0c;众多品牌和营销人员借助短视频推广宣传产品。 短视频文案作为短视频内容的关键部分&#xff0c;能够在极短时间内向受众传达品牌信息和产品特点。 不过&#xff0c;短视频文案的提取和创作确实极具挑…

CleanMyMac X2024破解版mac电脑清理工具

今天&#xff0c;我要跟大家分享一个让我彻底告别电脑卡顿的秘密武器——CleanMyMac X。这不仅仅是一款普通的清理工具&#xff0c;它是你电脑的私人健身教练&#xff0c;让电脑焕发青春活力&#xff01; CleanMyMac直装官方版下载地址&#xff1a; http://wm.makeding.com/i…

Xinstall助力App全渠道统计,参数传递下载提升用户体验!

在移动互联网时代&#xff0c;App已成为我们日常生活中不可或缺的一部分。然而&#xff0c;对于App开发者来说&#xff0c;如何有效地推广和运营自己的应用&#xff0c;却是一个不小的挑战。尤其是在面对众多渠道、复杂的数据统计和用户需求多样化的情况下&#xff0c;如何精准…

活动系统开发之采用设计模式与非设计模式的区别-需求整理

用户需求(活动系统)&#xff1a; 1、活动类型&#xff1a;答题、图片展示、签到、抽奖、组团等活动 2、活动介绍&#xff1a; a、答题活动&#xff1a; 第一种是签到后&#xff0c;随机抽取10道题&#xff0c;答对8到就可以抽奖&#xff1b; 第二种是随机抽取一道题&#xff0…

RSS/RFS/RPS

概念 在多核CPU中&#xff0c;有几种方式对网卡接收到到的数据进行分流以提升网络接收处理性能&#xff1a; RSS&#xff08;接收端缩放&#xff0c;Receive Side Scaling&#xff09;是一种网络适配器技术&#xff0c;用于将网络流量分配到多个CPU核上&#xff0c;从而提高并…

Linux操作系统:yum安装报错问题

目录 采用yum命令安装软件或库&#xff0c;报错的解决办法&#xff01; 第1步&#xff1a;检查yum组件 第2步&#xff1a;检查网络 第3步&#xff1a;检查网络防火墙 第4步&#xff1a;将yum源换成国内镜像源 采用yum命令安装软件或库&#xff0c;报错的解决办法&#xff…

macos 使用port查询并安装python2, python3多版本, 设置默认python版本方法

不管是新版macos还是旧版本的macos都可以使用macport这个包管理工具简单方便的在mac上面安装并存多个版本的python, 还可以利用port select --set python python3 来设置默认的python版本等. port search查询可用python安装包 命令 port search --name --line --regex ^pytho…

队列-数据结构

一、队列 FIFO 特点&#xff1a;先进先出&#xff0c;后进后出 允许从一段插入数据&#xff0c;另一端删除数据的线性存储结构 队尾&#xff1a;插入数据 入队 队头&#xff1a;删除数据 出队 管道实质上也是一个队列。 用途&#xff1a;缓存数据&#xff08;主要是避免两…

设置vim的tab宽度

设置vim的tab宽度 [gblocalhost test]$ vim ~/.vimrc set tabstop4 " 设置制表符的宽度为4个空格 set shiftwidth4 " 设置缩进时使用的空格数为4个空格 set expandtab " 将制表符自动转换为空格 set autoindent " 启用自动缩进…

HarmonyOS 开发范式、应用模型

ArkUI框架两种开发范式&#xff1a; 基于ArkTS的声明式开发范式&#xff08;简称“声明式开发范式”&#xff09;兼容JS的类Web开发范式&#xff08;简称“类Web开发范式”&#xff09;。 以下是两种开发范式的简单对比: 开发范式名称 语言生态 UI更新方式 声明式开发范式…

qt5.15.2 模拟LVGL8.3

目录 1.下载需要的东西1.SDL 动态库2.LVGL模拟器源码3.下载lv_drivers4.下载lvgl 2.创建QT例程3.往qt里移植lvgl1.将lv_port_pc_eclipse-release-v8.3文件夹里的文件全部复制到Qt_LVGL_Demo文件夹中2.将lv_drivers和lvgl文件夹复制到Qt_LVGL_Demo3.复制SDL2和lib文件夹 4.配置Q…

OpenCV绘图函数(14)图像上绘制文字的函数putText()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在图像上绘制指定的文本字符串。 cv::putText 函数在图像上绘制指定的文本字符串。无法使用指定字体渲染的符号会被问号&#xff08;?&#xff…

前端请求的路径baseURL怎么来的 ?nodejs解决cors问题的一种方法

背景&#xff1a;后端使用node.js搭建&#xff0c;用的是express 前端请求的路径baseURL怎么来的 &#xff1f; 前后端都在同一台电脑上运行&#xff0c;后端的域名就是localhost&#xff0c;如果使用的是http协议&#xff0c;后端监听的端口号为3000&#xff0c;那么前端请求…

Web3开发与安全:6个月高效学习路径

学习计划概览 总时长&#xff1a;6个月每周学习时间&#xff1a;10-15小时目标&#xff1a;掌握 Solidity 智能合约开发&#xff0c;并具备基本的智能合约安全审计能力。 第一阶段&#xff1a;基础准备&#xff08;第1-2周&#xff09; 1. 区块链基础&#xff08;1周&#x…