搜索引擎实时构建案例
· 阅读需 8 分钟
作者介绍
Ceven,德勤乐融(北京)科技有限公司 邮箱:likailin@deqinyuerong.com
前言
CloudCanal 近期提供了自定义代码构建宽表能力,我们第一时间参与了该特性内测,效果不错。开发流程详见官方文档 《CloudCanal自定义代码实时加工》
能力特点包括:
- 灵活,支持反查打宽表,特定逻辑数据清洗,对账,告警等场景
- 调试方便,通过任务参数配置自动打开 debug 端口,对接 IDE 调试
- SDK 接口清晰,提供丰富的上下文信息,方便数据逻辑开发
本文基于我们业务中的实际需求(MySQL -> ElasticSearch 宽表构建),梳理一下具体的开发调试流程,希望对大家有所帮助。
场景描述
MySQL 擅长关系型数据操作,我们在其中存储了 product, tag, product_tag_mapping 表数据,用以表示产品和标签之间多对多关系。精简的数据结构如下:

ElasticSearch 擅长搜索,但是并不支持不同索引间的联合查询, 所以构造宽表是业界刚需。我们存储其上的产品索引结构如下:
PUT es_product
{
"mappings" : {
"properties" : {
"id" : {
"type" : "integer"
},
"name" : {
"type" : "text"
},
"tags" : {
"type" : "nested",
"properties" : {
"id" : {
"type" : "integer"
},
"name" : {
"type" : "text"
}
}
}
}
}
}
同步策略
CloudCanal 在 同步 MySQL -> ElasticSearch 数据过程中,会兼顾全量和增量两种情况,我们可以创建两个独立的任务,分别同步产品的基础信息和附加信息(即标签信息)。
-
基础信息任务
- 使用基本的映射关系,将 MySQL 中的 product 数据表,映射到 es_product 索引中,即可保证全量和增量的数据同步。
-
附加信息任务
- 创建 CloudCanal 任务将 MySQL 中的 product_tag_mapping 数据表映射到 es_product 索引中,同步过程中反查源数据库中的 tag 信息,构造宽表数据,填充进 es_product 索引,实现附加信息全量和增量的数据同步。
