elasticsearch-全量-增量
全量
可使用或者参考easy-es
org.dromara.easyes.starter.service.impl.AutoProcessIndexSmoothlyServiceImpl#doUpdateIndex
数据源 改为读取可采用读取数据库表
private boolean doUpdateIndex(EntityInfo entityInfo, Class<?> clazz, RestHighLevelClient client) { // 获取索引信息 EsIndexInfo esIndexInfo = IndexUtils.getIndexInfo(client, entityInfo.getIndexName()); // 是否存在默认别名,若无则给添加 if (!esIndexInfo.getHasDefaultAlias()) { IndexUtils.addDefaultAlias(client, entityInfo.getIndexName()); } // 索引是否有变化 若有则创建新索引并无感迁移, 若无则直接返回托管成功 boolean isIndexNeedChange = IndexUtils.isIndexNeedChange(esIndexInfo, entityInfo, clazz); if (!isIndexNeedChange) { LogUtils.info("===> index has nothing changed"); return Boolean.TRUE; } // 创建新索引 String releaseIndexName = generateReleaseIndexName(entityInfo.getIndexName()); entityInfo.setReleaseIndexName(releaseIndexName); boolean isCreateIndexSuccess = doCreateIndex(entityInfo, clazz, client); if (!isCreateIndexSuccess) { LogUtils.error("create release index failed", "releaseIndex:" + releaseIndexName); return Boolean.FALSE; } // 迁移数据至新创建的索引 boolean isDataMigrationSuccess = doDataMigration(entityInfo.getIndexName(), releaseIndexName, entityInfo.getMaxResultWindow(), client); if (!isDataMigrationSuccess) { LogUtils.error("migrate data failed", "oldIndex:" + entityInfo.getIndexName(), "releaseIndex:" + releaseIndexName); return Boolean.FALSE; } // 原子操作 切换别名:将默认别名关联至新索引,并将旧索引的默认别名移除 boolean isChangeAliasSuccess = IndexUtils.changeAliasAtomic(client, entityInfo.getIndexName(), releaseIndexName); if (!isChangeAliasSuccess) { LogUtils.error("change alias atomically failed", "oldIndex:" + entityInfo.getIndexName(), "releaseIndex:" + releaseIndexName); return Boolean.FALSE; } // 删除旧索引 boolean isDeletedIndexSuccess = IndexUtils.deleteIndex(client, entityInfo.getIndexName()); if (!isDeletedIndexSuccess) { LogUtils.error("delete old index failed", "oldIndex:" + entityInfo.getIndexName()); return Boolean.FALSE; } // 用最新索引覆盖缓存中的老索引 entityInfo.setIndexName(releaseIndexName); // 将新索引名称记录至ee-distribute-lock索引中,以便在分布式环境下其它机器能够感知到 IndexUtils.saveReleaseIndex(releaseIndexName, client); // done. return Boolean.TRUE; }
增量
如何增量,以下
es我们为了方便搜索,会把数据库的多个表的字段拍平建立一个索引在订单项目维度,比如 订单和订单项目,在数据库层面会是2个表。
增量的采用 对应表的binlog 传入对应的id参数,还可以增加其他参数,比如可以增量指定条件的数据比如指定时间创建的单子
<select id="pagePatrolRecordGroup" parameterType="com.yxt.assist.toolkit.dao.patrol.criteria.OrderReqDTO" resultType="com.yxt.assist.toolkit.dao.patrol.dto.OrderItemDetailResReqDTO"> SELECT * FROM ORDER o JOIN order_item i ON o.id = i.order_id <if test="queryDTO.orderId != null and queryDTO.orderId != != ''"> and o.id=#{queryDTO.orderId} </if> <if test="queryDTO.orderItemId != null and queryDTO.orderItemId != != ''"> and i.id=#{orderItemId} </if> <if test="queryDTO.startTime != null"> and o.order_created_time >= #{queryDTO.startTime} </if> <if test="queryDTO.endTime != null"> and #{queryDTO.endTime} >=o.order_created_time </if> </select>
如何保证消息的有序性
我们可以采用每次都实时查数据库的方式,比如上面这种方式,我们可以通过加锁实时查上面sql的方式,也可以直接使用binlog消息
我们在数据库加个verson字段,修改的时候根据条件修改 判断version必须大于文档的version。否则认为是老消息丢弃,
标签:
elasticsearch
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!