• 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。

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

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

    1. @Component
    2. @Slf4j
    3. public class AddArticleIndexJob {
    4. @Resource
    5. private ArticleService articleService;
    6. @Resource
    7. private IndexService indexService;
    8. @Value("${elasticsearch.article.index}")
    9. private String indexName;
    10. private Date lastSyncTime = new Date(0); // 初始化为1970年1月1日
    11. /**
    12. * 每隔10分钟同步一次
    13. */
    14. @Scheduled(cron = "0 0/10 * * * ?")
    15. public void exec() {
    16. Date currentSyncTime = new Date(); // 当前同步的时间
    17. try {
    18. List
      articles = articleService.findByUpdatedAtAfter(lastSyncTime);
    19. for (Article article: articles) {
    20. if (article.getDelFlag() == 1) {
    21. Boolean success = indexService.deleteArticleIndex(indexName, String.valueOf(article.getId()));
    22. if (success) {
    23. log.info("删除索引成功");
    24. }
    25. }else {
    26. Boolean success = indexService.addArticleIndex(indexName, String.valueOf(article.getId()), article);
    27. if (success) {
    28. log.info("新增文章索引成功");
    29. }
    30. }
    31. }
    32. lastSyncTime = currentSyncTime;
    33. }catch (Exception e) {
    34. log.error("索引失效,请检查");
    35. }
    36. }
    37. }

  • 相关阅读:
    【Azure 媒体服务】Azure Media Player 在Edge浏览器中不能播放视频问题的分析与解决
    使用libcurl请求https的get/post
    兽用白油疫苗——博迈伦
    LeetCode(24)文本左右对齐【数组/字符串】【困难】
    Linux内核调试工具——devmem
    奇异递归模板
    云计算学习笔记——第五章 网络虚拟化
    More Effective C++学习笔记(6)
    call、bind、apply的作用与区别
    SQL sever中表管理
  • 原文地址:https://blog.csdn.net/yusheng_xyb/article/details/139026897