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。否则认为是老消息丢弃,

参考 局部更新按条件更新

 

posted @   意犹未尽  阅读(1805)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示