近期我的需求里需要将一部分数据库里的数据同步到 elasticSearch,然后从 es 进行搜索。
需要同步的表结构如下:
我需要将resourceId
, resourceName
, authorName
和 categoryName
这四个字段的数据同步到 es 中。sql 查询语句如下:
select r.resouceId, rf.resourceName, a.authorName, cr.categoryId, c.categoryName
from resource as r
left join resourcefu as rf on r.resourceId = rf.resourceId
left join author as a on r.authorId = a.authorId
left join category_rel as cr on r.resourceId = cr.resourceId
left join category as c on cr.caetgoryId = c.categoryId
首先想到的就是监听 binlog,进而查到了 canal.
于是开始使用 canal-deployer
监听 binlog, canal adapter
将监听的表的数据同步给 Es. 那么就需要在 adpter/config/es7
文件里将上述 sql 写入进去。
一切配置好后,
categoryId
和resourceId
, designerName
和 categoryName
为空。查了发现不止我一个人有这个问题,也就是说canal本身对这种关联关系表的支持并不太友好
再然后我就想将两张表合为一张再进行查询,sql 如下
select r.resouceId, rf.resourceName, a.authorName, d.categoryId, d.categoryName
from resource as r
left join resourcefu as rf on r.resourceId = rf.resourceId
left join author as a on r.authorId = a.authorId
left join (select cr.categoryId, c.categoryName, cr.resourceId from category_rel as cr left join category as c) d on r.resourceId = rc.resourceId
还是不行,这下直接在启动 adpater 阶段就报了sqlParseExcpetion
错误
经查发现 canal adapter 虽然能支持关联表,但是对关联表由诸多限制,比如:
这下就感觉使用 canal_adapter
的路被完全堵死了。
只剩下其他方法,比如:
各位牛爷爷们,我觉得我这个同步场景应该不复杂,为什么 canal 这么不友好呢,还是我没学会如何写 sql?求指教。
我的需求是:如果canal能够完美解决我的场景那是最好的
如果不能,在我这种场景下用什么同步方法比较合适?
你这样是不是source和target关联不起来了,es里面只有四个字段,source字段更新同步时怎么确保和target的关系?没有直接关联关系吧,感觉你应该存上关联的键,这样就算自己解析也很方便处理