【ES】【实战】----index索引数量过大,后缀加日期处理 实战过程 xxxx_20250906
前言要实现按天创建索引如article_20250906的需求我们需要通过 Easy-Es 的索引名称处理器来动态生成索引名。以下是具体实现方案1. 自定义索引名称处理器packagecom.zgb.config;importorg.dromara.easyes.core.handler.IndexNameHandler;importjava.time.LocalDate;importjava.time.format.DateTimeFormatter;/** * 文章索引名称处理器 * 实现按天动态生成索引名格式为: article_yyyyMMdd * author 架构师 */publicclassArticleIndexNameHandlerimplementsIndexNameHandler{/** * 动态生成索引名称 * return 格式化后的索引名称 */OverridepublicStringdynamicIndexName(){// 获取当前日期并格式化为yyyyMMddStringdateSuffixLocalDate.now().format(DateTimeFormatter.ofPattern(yyyyMMdd));// 返回拼接后的索引名returnarticle_dateSuffix;}}2. 修改实体类的索引配置在你提供的Article实体类上添加动态索引处理器配置packagecom.zgb.entity;importcom.fasterxml.jackson.annotation.JsonFormat;importcom.zgb.config.ArticleIndexNameHandler;importlombok.Data;importorg.dromara.easyes.annotation.*;importorg.dromara.easyes.annotation.rely.FieldType;importjava.time.LocalDateTime;importjava.util.List;/** * 文章索引实体类 * 按天创建索引格式为article_yyyyMMdd * author 架构师 */DataIndexName(valuearticle,// 基础索引名dynamicIndexHandlerArticleIndexNameHandler.class,// 指定动态索引处理器keepGlobalPrefixfalse// 不保留全局前缀使用处理器生成的完整名称)publicclassArticle{/** * 文章ID */IdprivateStringid;/** * 文章标题 * 分词,可搜索,权重较高 */HighLight(mappingFieldtitleHighLight)// 高亮配置IndexField(fieldTypeFieldType.TEXT,analyzerik_max_word,searchAnalyzerik_smart,boost2.0f)privateStringtitle;/** * 标题高亮结果 */privateStringtitleHighLight;/** * 文章内容 * 分词,可搜索 */HighLight(mappingFieldcontentHighLight)IndexField(fieldTypeFieldType.TEXT,analyzerik_max_word,searchAnalyzerik_smart)privateStringcontent;/** * 内容高亮结果 */privateStringcontentHighLight;/** * 文章摘要 */IndexField(fieldTypeFieldType.TEXT,analyzerik_max_word)privateStringsummary;/** * 文章作者 */IndexField(fieldTypeFieldType.KEYWORD)privateStringauthor;/** * 创建时间 */IndexField(fieldTypeFieldType.DATE,dateFormatyyyy-MM-dd HH:mm:ss)JsonFormat(patternyyyy-MM-dd HH:mm:ss,timezoneGMT8)privateLocalDateTimecreateTime;/** * 文章类型 * 如: 原创、转载、翻译 */IndexField(fieldTypeFieldType.KEYWORD)privateStringtype;/** * 文章标签 */IndexField(fieldTypeFieldType.KEYWORD)privateListStringtags;/** * 点赞数 */IndexField(fieldTypeFieldType.INTEGER)privateIntegerlikeCount;/** * 分享数 */IndexField(fieldTypeFieldType.INTEGER)privateIntegershareCount;/** * 预览数 */IndexField(fieldTypeFieldType.INTEGER)privateIntegerviewCount;}3. 配置文件调整spring:easy-es:enable:trueaddress:127.0.0.1:9200# 单机版配置分布式版使用逗号分隔多个地址username:elasticpassword:123456connection-timeout:5000socket-timeout:30000global-config:process-index-name:false# 关闭全局处理由自定义处理器接管db-config:id-type:custom# 自定义ID生成策略# 不设置table-prefix避免与动态索引名冲突4. 索引管理工具类packagecom.zgb.util;importcom.zgb.entity.Article;importorg.dromara.easyes.core.biz.EsIndexParam;importorg.dromara.easyes.core.manager.IndexManager;importorg.springframework.stereotype.Component;importjavax.annotation.Resource;importjava.time.LocalDate;importjava.time.format.DateTimeFormatter;/** * 文章索引管理工具类 * 用于创建和管理按天分割的文章索引 * author 架构师 */ComponentpublicclassArticleIndexManager{ResourceprivateIndexManagerindexManager;/** * 创建指定日期的文章索引 * param date 指定日期 * return 是否创建成功 */publicbooleancreateIndex(LocalDatedate){StringindexNamearticle_date.format(DateTimeFormatter.ofPattern(yyyyMMdd));// 构建索引参数使用提供的Article实体类EsIndexParamesIndexParamEsIndexParam.builder().indexName(indexName).clazz(Article.class)// 关联实体类确保映射关系正确.build();// 创建索引returnindexManager.createIndex(esIndexParam);}/** * 创建今天的文章索引 * return 是否创建成功 */publicbooleancreateTodayIndex(){returncreateIndex(LocalDate.now());}/** * 删除指定日期的文章索引 * param date 指定日期 * return 是否删除成功 */publicbooleandeleteIndex(LocalDatedate){StringindexNamearticle_date.format(DateTimeFormatter.ofPattern(yyyyMMdd));returnindexManager.deleteIndex(indexName);}/** * 判断指定日期的索引是否存在 * param date 指定日期 * return 是否存在 */publicbooleanexistsIndex(LocalDatedate){StringindexNamearticle_date.format(DateTimeFormatter.ofPattern(yyyyMMdd));returnindexManager.existsIndex(indexName);}}5. 定时任务自动创建索引 IndexAutoCreateTaskpackagecom.zgb.task;importcom.zgb.util.ArticleIndexManager;importlombok.RequiredArgsConstructor;importorg.springframework.scheduling.annotation.Scheduled;importorg.springframework.stereotype.Component;/** * 索引自动创建定时任务 * 确保每天都有对应的索引可用 * author 架构师 */ComponentRequiredArgsConstructorpublicclassIndexAutoCreateTask{privatefinalArticleIndexManagerindexManager;/** * 每天凌晨1点创建当天的索引 * 防止当天第一次插入数据时才创建索引可能带来的性能问题 */Scheduled(cron0 0 1 * * ?)publicvoidcreateTodayIndex(){// 先判断索引是否已存在避免重复创建if(!indexManager.existsIndex(LocalDate.now())){booleanresultindexManager.createTodayIndex();if(result){System.out.println(成功创建当天文章索引: article_LocalDate.now().format(DateTimeFormatter.ofPattern(yyyyMMdd)));}else{System.err.println(创建当天文章索引失败);}}}}6. 按日期范围查询的Service实现/** * 按日期范围查询文章 * param keyword 搜索关键词 * param startDate 开始日期 * param endDate 结束日期 * param pageNum 页码 * param pageSize 每页条数 * return 分页结果 */publicPageInfoArticlesearchByDateRange(Stringkeyword,LocalDatestartDate,LocalDateendDate,IntegerpageNum,IntegerpageSize){// 构建查询条件LambdaEsQueryWrapperArticlewrappernewLambdaEsQueryWrapper();// 设置关键词匹配标题、内容或摘要if(keyword!null!keyword.isEmpty()){wrapper.match(Article::getTitle,keyword).or().match(Article::getContent,keyword).or().match(Article::getSummary,keyword);}// 处理日期范围索引查询if(startDate!nullendDate!null){// 构建索引名称通配符StringstartMonthstartDate.format(DateTimeFormatter.ofPattern(yyyyMM));StringendMonthendDate.format(DateTimeFormatter.ofPattern(yyyyMM));if(startMonth.equals(endMonth)){// 同一月份使用更精确的通配符wrapper.index(article_startMonth*);}else{// 跨月份使用年份通配符StringyearstartDate.format(DateTimeFormatter.ofPattern(yyyy));wrapper.index(article_year*);}// 同时添加创建时间过滤确保数据准确性wrapper.ge(Article::getCreateTime,startDate.atStartOfDay()).le(Article::getCreateTime,endDate.atTime(23,59,59));}elseif(startDate!null){// 只指定开始日期wrapper.index(article_startDate.format(DateTimeFormatter.ofPattern(yyyyMM))*).ge(Article::getCreateTime,startDate.atStartOfDay());}elseif(endDate!null){// 只指定结束日期wrapper.index(article_endDate.format(DateTimeFormatter.ofPattern(yyyyMM))*).le(Article::getCreateTime,endDate.atTime(23,59,59));}// 按点赞数和创建时间排序wrapper.orderByDesc(Article::getLikeCount).orderByDesc(Article::getCreateTime);// 执行查询returnarticleEsMapper.pageQuery(wrapper,pageNum,pageSize);}实现说明索引动态生成通过ArticleIndexNameHandler实现了按天生成索引名的功能与你提供的Article实体类完美结合索引管理工具类ArticleIndexManager专门用于管理按天创建的索引定时任务确保每天凌晨自动创建当天索引避免业务高峰期创建索引影响性能查询优化单天查询自动使用当天索引如article_20250906跨天查询使用通配符匹配多个索引并结合创建时间过滤保证数据准确性保持了原有实体类的所有字段和注解配置不影响原有的搜索功能这种实现方式既满足了按天分割索引的需求又完整保留了你提供的Article实体类的所有特性包括字段映射、分词策略和高亮配置等。

相关新闻

Sentinel 链路流控模式配置细节:关闭context整合

Sentinel 链路流控模式配置细节:关闭context整合

什么是“链路模式” 链路模式(也叫关联模式或入口限流)是指根据资源调用链路进行限流,只针对从某个入口进入的请求进行限流,而不是对所有请求进行限流。 问题背景 默认行为:Sentinel默认只将Controller中的方法标记…

2026/7/3 15:42:19 阅读更多 →
面试必备:掌握这些自动化面试题

面试必备:掌握这些自动化面试题

面试时,自动化是软件测试高频面试内容,通过学习和准备面试题,你会对可能遇到的问题有所准备,从而减轻面试时的紧张感,让你在面试中稳操胜券! 今天,分享一些在面试中可能会遇到的自动化测试面试…

2026/7/3 15:42:20 阅读更多 →
AI大模型时代,家长如何规划孩子的AI学习路线,非常详细收藏我这一篇就够了

AI大模型时代,家长如何规划孩子的AI学习路线,非常详细收藏我这一篇就够了

引言 最近,有许多家长来咨询有关孩子学习AI的问题,他们表示自己不太懂人工智能相关知识,对科技了解的也不多,但是想让孩子学点AI知识,毕竟身处于人工智能的大模型时代,AI的学习要从娃娃抓起,到…

2026/7/3 15:42:20 阅读更多 →

最新新闻

SQL聚合函数实战:SQL Ultimate Course数据分析基础指南

SQL聚合函数实战:SQL Ultimate Course数据分析基础指南

SQL聚合函数实战:SQL Ultimate Course数据分析基础指南 【免费下载链接】sql-ultimate-course The most comprehensive SQL guide from a real-world expert! Learn everything from basics to advanced queries, optimizations, and real-world SQL 项目地址: h…

2026/7/4 6:46:51 阅读更多 →
switch.vim性能优化:大型代码库中的高效文本切换策略终极指南

switch.vim性能优化:大型代码库中的高效文本切换策略终极指南

switch.vim性能优化:大型代码库中的高效文本切换策略终极指南 【免费下载链接】switch.vim A simple Vim plugin to switch segments of text with predefined replacements 项目地址: https://gitcode.com/gh_mirrors/sw/switch.vim 你是否在大型代码库中频…

2026/7/4 6:46:51 阅读更多 →
如何智能切换DLSS版本:游戏性能优化的终极指南

如何智能切换DLSS版本:游戏性能优化的终极指南

如何智能切换DLSS版本:游戏性能优化的终极指南 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 还在为游戏卡顿而烦恼吗?想要提升游戏帧率却不知从何下手?DLSS Swapper正是你需要的游…

2026/7/4 6:44:51 阅读更多 →
CANN/asc-devkit LoadData矩阵搬运

CANN/asc-devkit LoadData矩阵搬运

# LoadData(2D矩阵搬运) 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景…

2026/7/4 6:44:51 阅读更多 →
终极音乐解析指南:4个PHP文件搞定四大平台音乐地址

终极音乐解析指南:4个PHP文件搞定四大平台音乐地址

终极音乐解析指南:4个PHP文件搞定四大平台音乐地址 【免费下载链接】music-api Music API 项目地址: https://gitcode.com/gh_mirrors/mu/music-api 还在为音乐平台API接口复杂而头疼吗?今天我要介绍一个简单实用的开源工具——music-api&#xf…

2026/7/4 6:42:50 阅读更多 →
ftpserver故障排除手册:常见问题诊断与解决方案大全

ftpserver故障排除手册:常见问题诊断与解决方案大全

ftpserver故障排除手册:常见问题诊断与解决方案大全 【免费下载链接】ftpserver Golang based autonomous FTP server with SFTP, S3, Dropbox, and Google Drive connectors. 项目地址: https://gitcode.com/gh_mirrors/ftp/ftpserver 作为一名Go语言开发的…

2026/7/4 6:40:50 阅读更多 →

日新闻

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 正式发布,这是一个关键的安全修复版本,修复了多个方面的问题,还对部分功能进行了优化。 安全修复亮点 此次发布在安全修复上表现突出。binprot 避免了项目引用计数溢出,mcmc 因安全问题提升了上游版本号&#xf…

2026/7/4 0:04:29 阅读更多 →
终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案 【免费下载链接】HMCL A Minecraft Launcher which is multi-functional, cross-platform and popular 项目地址: https://gitcode.com/gh_mirrors/hm/HMCL HMCL(Hello Minecraft! Lau…

2026/7/4 0:06:29 阅读更多 →
KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

1. KMX63与PIC18F66K40的硬件协同架构解析KMX63作为一款三轴加速度计和磁力计组合传感器,与PIC18F66K40微控制器的搭配堪称嵌入式HMI开发的黄金组合。这套硬件组合的核心优势在于KMX63提供的高精度运动感知能力与PIC18F66K40强大的信号处理能力形成了完美互补。KMX6…

2026/7/4 0:06:29 阅读更多 →

周新闻

月新闻