当前位置: 首页 > news >正文

SpringBoot+Elasticsearch按日期实现动态创建索引(分表)

😊 @ 作者: 一恍过去
💖 @ 主页: https://blog.csdn.net/zhuocailing3390
🎊 @ 社区: Java技术栈交流
🎉 @ 主题: SpringBoot+Elasticsearch按日期实现动态创建索引(分表)
⏱️ @ 创作时间: 2023年02月19日

目录

  • 前言
  • 1、创建动态索引配置文件
  • 2、创建实体
  • 3、Repository对象
  • 4、Controller对象

前言

SpringBoot+Elasticsearch,通过@Document注解,利用EL表达式指定到配置文件,实现动态生成IndexName值,比如:

@Document(indexName = "product_#{@esIndex}")

1、创建动态索引配置文件

在配置文件中按照yyyy_MM_dd格式返回索引值的后缀,并且通过定时任务对索引值实现更新操作,定时任务是通过重建Bean对象实现对esIndex值进行更新。

重建Bean原因:Bean默认只有在服务启动时加载,若需动态改变Bean就要先销毁这个Bean之后再重新加载。


@Configuration
public class EsIndexConfig {@Resourceprivate ApplicationContext applicationContext;@Resourceprivate ElasticsearchRestTemplate elasticsearchRestTemplate;@Bean(name = "esIndex")public static String esIndex() {// 此处模拟按日期创建索引// 由于方便测试,索引直接返回时间戳,作为索引名称,时间可以为yyyy-MM-ddSimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd");String date = sdf.format(new Date());System.out.println(date);date = System.currentTimeMillis() / 1000 + "";System.out.println("date:" + date);return date;}// 每天0点@Scheduled(cron = "0 0 0 * * ?")public void updateEsIndex() {DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) applicationContext.getAutowireCapableBeanFactory();// 销毁指定实例defaultListableBeanFactory.destroySingleton("esIndex");String index = EsIndexConfig.esIndex();// 重新注册defaultListableBeanFactory.registerSingleton("esIndex", index);// 对索引进行一次手动创建(因为自动创建会丢失shards参数)IndexOperations indexOperations = elasticsearchRestTemplate.indexOps(ProductEntity.class);if (!indexOperations.exists()) {indexOperations.create();}}
}

其他做法:
也可以不通过定时任务更新索引值,可以在操作save方法前,判断索引是否存在,如果不存在再进行重建Bean更新索引值,如下实例:

IndexOperations indexOperations = elasticsearchRestTemplate.indexOps(ProductEntity.class);if (!indexOperations.exists()) {索引不存在,则重建Bean更新索引值}

2、创建实体

创建的实体类,需要关闭自动创建index属性(createIndex = false),通过配置文件来创建索引值,原因:如果开启自动索引,在项目启动时的第一个索引会完整创建成功,但是后续通过定时任务创建的索引会确实配置的shards、replicas参数

@Document(indexName = "product_#{@esIndex}", createIndex = false, shards = 3, replicas = 2)
@Data
public class ProductEntity implements Serializable {@Idprivate String id;/*** 文本类型,使用ik分词器*/@Field(type = FieldType.Text, analyzer = "ik_max_word")private String name;/*** 价格*/@Field(type = FieldType.Double)private BigDecimal money;/*** 时间戳*/@Field(type = FieldType.Long)private Long time;/*** 颜色*/@Field(type = FieldType.Keyword)private String color;
}

3、Repository对象

public interface ProductRepository extends ElasticsearchRepository<ProductEntity, String> {}

4、Controller对象

测试时,可以将索引动态更新的定时任务时间设置为一分钟,并且返回的索引值由yyyy_MM_dd修改为一个随机数;调用save方法后,过一分钟后再次进行调用,通过head/kibana观察是否生成了新的索引。

@RestController
@RequestMapping("es")
@Slf4j
public class ProductController {@Resourceprivate ProductRepository productRepository;@PostMappingpublic void save() {String[] colors = {"red", "purple", "blue"};String[] name = {"手机", "电脑", "微波炉", "电视"};// 新增列表数据List<ProductEntity> testList = new ArrayList<>();long sys = System.currentTimeMillis();for (int i = 0; i < 10; i++) {// 模拟随机数double random = Math.random() * 1000;ProductEntity productEntity = new ProductEntity();productEntity.setId(i + "");productEntity.setName(name[i % 4]);productEntity.setMoney(new BigDecimal(random));productEntity.setTime(sys + i % 3);productEntity.setColor(colors[i % 3]);testList.add(productEntity);}// 新增成功后,在head或者kibana中就可以看到相应数据,如果save时数据Id存在则更新操作// 批量新增productRepository.saveAll(testList);// 单个新增ProductEntity productEntity = testList.get(9);productEntity.setId("11");productRepository.save(productEntity);}
}

相关文章:

SpringBoot+Elasticsearch按日期实现动态创建索引(分表)

&#x1f60a; 作者&#xff1a; 一恍过去&#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390&#x1f38a; 社区&#xff1a; Java技术栈交流&#x1f389; 主题&#xff1a; SpringBootElasticsearch按日期实现动态创建索引(分表)⏱️ 创作时间&…...

Terraform基础入门 (Infrastructure as Code)

文章目录前言介绍Terraform 术语Terraform 如何工作关于provider安装开启本地缓存demo1(dockernginx)demo2(dockerzookeeperkafka)参考资料前言 像写代码一样管理基础设施。 Terraform 使用较为高级的配置文件语法来描述基础设施&#xff0c;这个特性让你对配置文件进行版本化…...

Redis内存回收

Redis 内存回收 Redis之所以性能很强&#xff0c;最主要的原因是基于内存存储&#xff0c;然而单节点的Redis其内存大小不宜过大&#xff0c;会影响持久化或主从同步性能 可以通过修改配置文件来设置Redis的最大内存 maxmemory <bytes>当内存达到上限时&#xff0c;就…...

ROS2 入门应用 引用自定义消息(C++)

ROS2 入门应用 引用自定义消息&#xff08;C&#xff09;1. 查看自定义消息2. 修改话题发布3. 修改话题订阅4. 修改依赖关系5. 修改编译信息6. 编译和运行1. 查看自定义消息 引用在《ROS2 入门应用 创建自定义接口》中自定义的消息Sphere.msg ros2 interface show tutorial_i…...

Spring中的数据校验

数据校验基础 参考&#xff1a; Java Bean Validation 规范 Spring对Bean Validation的支持 Spring定义了一个接口org.springframework.validation.Validator&#xff0c;用于应用相关的对象的校验器。 这个接口完全从基础设施或者上下文中脱离的&#xff0c;这意味着它没有…...

python批量翻译excel表格中的英文

python批量翻译excel表格中的英文需求背景主要设计分析具体实现表格操作请求百度翻译api多线程控制台显示进度完整源码需求背景 女朋友的论文需要爬取YouTube视频热评&#xff0c;但爬下来的都是外文。 主要设计 读取一个表格文件&#xff0c;获取需要翻译的文本 使用百度翻译…...

基于SSM框架的RBAC权限系统设计与 实现

基于SSM框架的RBAC权限系统设计与 实现 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景…...

目标检测各常见评价指标详解

注&#xff1a;本文仅供学习&#xff0c;未经同意请勿转载 说明&#xff1a;该博客来源于xiaobai_Ry:2020年3月笔记 对应的PDF下载链接在&#xff1a;待上传 目录 常见的评价指标 准确率 &#xff08;Accuracy&#xff09; 混淆矩阵 &#xff08;Confusion Matrix&#xff…...

深入讲解Kubernetes架构-控制器

在机器人技术和自动化领域&#xff0c;控制回路&#xff08;Control Loop&#xff09;是一个非终止回路&#xff0c;用于调节系统状态。这是一个控制环的例子&#xff1a;房间里的温度自动调节器。当你设置了温度&#xff0c;告诉了温度自动调节器你的期望状态&#xff08;Desi…...

Urho3D本地化 国际化

本地化子系统提供了创建多语言应用程序的简单方法。 初始化 在使用子系统之前&#xff0c;需要加载本地化字符串集合。通常的做法是在应用程序启动时执行此操作。可以加载多个集合文件&#xff0c;每个集合文件只能定义一种或多种语言。例如&#xff1a; Localization* l10n…...

千锋教育嵌入式物联网教程之系统编程篇学习-04

目录 alarm函数 raise函数 abort函数 pause函数 转折点 signal函数 可重入函数 信号集 sigemptyset() sigfillset sigismember()​ sigaddset()​ sigdelset()​ 代码讲解 信号阻塞集 sigprocmask()​ alarm函数 相当于一个闹钟&#xff0c;默认动作是终止调用alarm函数的进…...

【运维】什么是 DevOps?

文章目录什么是 DevOps&#xff1f;如何实现 DevOpsDevOps工作原理&#xff1a; DevOps生命周期DevOps 文化DevOps 工具&#xff1a;构建 DevOps 工具链DevOps 和云原生开发什么是 DevSecOps&#xff1f;DevOps 和站点可靠性工程 (SRE)什么是 DevOps&#xff1f; DevOps 通过结…...

【C++入门】引用、内联函数、auto关键字、基于范围的for循环(C++11)、指针空值nullptr(C++11)

文章目录引用引用概念引用特性引用使用场景常引用内联函数宏的优缺点&#xff1f;C有哪些技术替代宏&#xff1f;auto关键字auto不能推导的场景基于范围的for循环(C11)指针空值nullptr(C11)引用 引用概念 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&…...

《FPGA学习》->多个按键控制LED灯

&#x1f34e;与其担心未来&#xff0c;不如现在好好努力。在这条路上&#xff0c;只有奋斗才能给你安全感。你若努力&#xff0c;全世界都会为你让路。本次项目任务&#xff0c;利用开发板上的4个按键KEY1&#xff0c;KEY2&#xff0c;KEY3&#xff0c;KEY4和2个LED灯LED1&…...

vb.net计算之.net core基础(4)-项目与程序结构(2)

目录 Namespace 语句Visual Basic 中的命名空间完全限定名命名空间可以定义什么全局关键字命名规范条件编译拆分和合并语句拆分成多行在同一行上放置多个语句为代码行添加标签注释串联成员访问运算符点运算符 `.`感叹号 `!`运算符Me 关键字MyMyBaseMyClassNamespace 语句 <…...

基于RK3588的嵌入式linux系统开发(五)——uboot优化修改(按任意按键停止autoboot)

我们通常情况下&#xff0c;芯片进入uboot后&#xff0c;会根据设置的bootdelay时间进行倒数计数。这时候在终端按任意键&#xff0c;即可退出autoboot&#xff0c;进入uboot的命令行模式。 官方提供的uboot源码中&#xff0c;为了防止调试串口干扰导致不能进入系统&#xff0c…...

Lumerical---在FDTD和MODE工程中的PML边界条件

Lumerical---在FDTD和MODE工程中的PML边界条件 引言PML边界条件实现原理PML 类型PML 配置文件PML 配置文件选项Standard(标准)Stabilized(稳定性)Steep AngleCustom(陡角)对于不同的边界使用不同的配置FDE,varFDTD和FDTD SolverPML 参数阅读这篇前,推荐阅读边界条件综述…...

论文投稿指南——中文核心期刊推荐(社会学)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…...

KVM-4、KVM 高级功能详解

1. 半虚拟化驱动 1.1 virtio 概述 KVM 是必须使用硬件虚拟化辅助技术(如 Intel VT-x 、AMD-V)的 Hypervisor,在CPU 运行效率方面有硬件支持,其效率是比较高的;在有 Intel EPT 特性支持的平台上,内存虚拟化的效率也较高。 QEMU/KVM 提供了全虚拟化环境,可以让客户机不经…...

【Linux】进程状态

文章目录1. 阻塞1. 举例2. 为什么要阻塞&#xff1f;3.操作系统层面上如何理解进程等待某种资源就绪呢&#xff1f;资源进程4. 总结2.挂起3.Linux进程状态1. R状态进程只要是R状态&#xff0c;就一定是在CPU运行吗&#xff1f;证明当前进程运行状态生成程序查看进程2. S休眠状态…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...