es索引同步

通过向索引中添加文章信息最终实现了课 程的搜索,我们发现文章信息是先保存在关系数据库中,而后再写入索引,这个过程是将关系数据中的数据同步到elasticsearch索引中的过程,可以简单成为索引同步。

通常项目中使用elasticsearch需要完成索引同步,索引同步的方法很多:

1、针对实时性非常高的场景需要满足数据的及时同步,可以同步调用,或使用Canal去实现。

1)同步调用即在向MySQL写数据后远程调用搜索服务的接口写入索引,此方法简单但是耦合代码太高。

2)可以使用一个中间的软件canal解决耦合性的问题,但存在学习与维护成本。

canal主要用途是基于 MySQL 数据库增量日志解析,并能提供增量数据订阅和消费,实现将MySQL的数据同步到消息队列、Elasticsearch、其它数据库等,应用场景十分丰富。

2、当索引同步的实时性要求不高时可用的技术比较多,比如:MQ、Logstash、任务调度等。

MQ:向mysql写数据的时候向mq写入消息,搜索服务监听MQ,收到消息后写入索引。使用MQ的优势是代码解耦,但是需要处理消息可靠性的问题有一定的技术成本,做到消息可靠性需要做到生产者投递成功、消息持久化以及消费者消费成功三个方面,另外还要做好消息幂等性问题。

Logstash: 开源实时日志分析平台 ELK包括Elasticsearch、Kibana、Logstash,Logstash负责收集、解析和转换日志信息,可以实现MySQL与Elasticsearch之间的数据同步。也可以实现解耦合并且是官方推荐,但需要增加学习与维护成本。

任务调度:向mysql写数据的时候记录修改记录,开启一个定时任务根据修改记录将数据同步到Elasticsearch。

因为我这个是个人博客系统,所以对数据同步的实时性要求不高,因此使用任务调度实现索引同步。

为了避免重复索引已经存在且未更新的数据,可以使用增量同步策略,仅同步新增和更新的数据,同时删除已经被标记删除的数据。

java 复制代码
@Component
@Slf4j
public class AddArticleIndexJob {

    @Resource
    private ArticleService articleService;

    @Resource
    private IndexService indexService;


    @Value("${elasticsearch.article.index}")
    private String indexName;

    private Date lastSyncTime = new Date(0); // 初始化为1970年1月1日

    /**
     * 每隔10分钟同步一次
     */
    @Scheduled(cron = "0 0/10 * * * ?")
    public void exec() {
        Date currentSyncTime = new Date(); // 当前同步的时间
        try {
            List<Article> articles = articleService.findByUpdatedAtAfter(lastSyncTime);
            for (Article article: articles) {
                if (article.getDelFlag() == 1) {
                    Boolean success = indexService.deleteArticleIndex(indexName, String.valueOf(article.getId()));
                    if (success) {
                        log.info("删除索引成功");
                    }
                }else {
                    Boolean success = indexService.addArticleIndex(indexName, String.valueOf(article.getId()), article);
                    if (success) {
                        log.info("新增文章索引成功");
                    }
                }
            }
            lastSyncTime = currentSyncTime;
        }catch (Exception e) {
            log.error("索引失效,请检查");
        }
    }
}
相关推荐
insertYam9 分钟前
[hadoop高可用架构]
大数据·hadoop·架构
axiao91 小时前
2026年呼和浩特集团品牌全域传播服务商推荐:GEO优化+短视频+网站+广告全链路机构
大数据·人工智能
朴实赋能1 小时前
妇儿医院 AI 助手怎么落地?CareWork 本地化智能体的多 Agent 协同与合规边界设计
大数据·人工智能·腾讯云ai代码助手·ai 智能体·医疗多 agent 协同·妇儿医院 ai 助手·本地化部署 ai
Cx330❀1 小时前
【LangChain】LangChain 核心技术全景指南:从基础入门到 LCEL 链式编程
大数据·elasticsearch·搜索引擎·性能优化·langchain·全文检索
字节数据平台4 小时前
iDA:从 ChatBI 到专业数据分析助手的演进之路
大数据·人工智能·机器学习·数据分析
2401_894915534 小时前
GEO 优化源码全解析:从搜索引擎到 AI 引擎的底层改写逻辑
java·服务器·前端·数据库·人工智能·分布式·搜索引擎
万岳软件开发小城9 小时前
同城O2O系统源码核心架构分析:多商户、订单、支付及运营体系设计
大数据·同城外卖系统源码·同城o2o系统源码·外卖app开发·同城o2o小程序开发·同城o2o软件开发
兴通物联科技9 小时前
SMT PCB 微小 DataMatrix 码扫不动问题分析 兴通 XT8601B 600 万像素工业读码器落地实践
大数据·人工智能·单片机·嵌入式硬件·算法·计算机视觉
进度猫10 小时前
5个甘特图高阶用法,不止简单排工期
大数据·人工智能·产品经理·甘特图·项目管理软件