当前位置: 首页 > 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休眠状态…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...