背景:项目重构,有些负责查询想要上 ES 。之前没有使用 ES 的项目经验,网上简单的学习了一下 es 的搭建和一些 api 的调用。 但是找到的学习资料实战部分大多都是单表的数据,也都是偏简单的一些需求。所以对 es 在实际项目中的使用方式有些疑惑点,希望大佬们可以指点一二。
如果所涉及到的查询业务只有单表,为了减少业务代码的开发。目前了解到的中间件是 canal ,监听 binlog ,将数据同步到 ES 中。 想问下大家,实际使用中也是这种思路吗。
如果涉及到多表关联查询,是不是只能通过业务代码往 ES 里面灌数据。 举个实际的场景: 比如:学生表 student 中有 id ,code ,name ,age ,address ,schoolname ,tel ... 等字段 年级表 class 中有 id ,name ...等字段 还有其他的一些基础数据表。
现在想实现一个学员列表的需求。 列表中,会以学生为维度,展示其他很多表中涉及到的字段。 搜索条件有:学员姓名,学员编码( code ),学校,入学时间等字段。
如果基于 mysql 实现,可能需要多张业务表关联查询,甚至有些字段可能一个 sql 查不出来,需要在查询出来的结果中遍历,单独再去查询某个字段,然后赋值。这样的话,表数据比较多查询效率很慢。
如果基于 ES 来实现,我的思路是:
总结:查询字段放 es ,表格字段查 mysql
我不知道我的实现思路是否使用合理和正确。如果合理的话,感觉代码的侵入性太强了。比如上述问题二,如果修改了某个基础标的数据,我还要对应的修改 es 中的数据。可能系统里我都不知道都有哪些地方修改基础数据。
希望大家可以提供一些实际工作中应对以上场景时的解决思路。如果有一些参考的教程资料关于 es 的也可以提供。 感谢大家
1
brightzhuhl 2023-02-20 18:15:34 +08:00
单表一般不需要 ES 的,数据库做好索引就 ok
多表聚合的情况,肯定是需要单独的代码逻辑来查询数据库数据构建为 es 索引的。但是可以通过 mq 解耦。 目前我们这里使用 canal 还会定义一个通用的 mq 转发层,业务只需要定义好监听字段的规则,转发层会将 binlog 消息投递到对应的 mq 队列,应用代码监听队列之后再触发一个重新构建 es 的 mq 消息 |
2
TWorldIsNButThis 2023-02-20 18:32:27 +08:00 via iPhone
|
3
RedBeanIce 2023-02-20 18:45:19 +08:00 via iPhone
你是对的,至于代码里面的对象转 es ,可以发送 kafka 到 lodash ?或者什么的地方,可以直接塞到 es 里面去。
|
4
bugsnail 2023-02-20 18:50:30 +08:00
差不多是这样,像 1 楼说的,单表不需要上 ES
除非几百万数据单字段 like 模糊搜索 |
5
jiobanma OP @brightzhuhl 您说的这个思路是不是这样的,多表聚合的时候,canal 监听 binlog ,发现数据变化,将 binlog 转发到 mq 中,然后业务代码监听 mq ,接收到消息编写对应的业务代码来维护 es 中的数据
|
6
jiobanma OP @RedBeanIce lodash 是什么意思呀?
|
8
gofocus 2023-05-18 18:01:18 +08:00
upup
|