关于 Elasticsearch 的使用场景问题求指教

2023-02-20 17:48:54 +08:00
 jiobanma

背景:项目重构,有些负责查询想要上 ES 。之前没有使用 ES 的项目经验,网上简单的学习了一下 es 的搭建和一些 api 的调用。 但是找到的学习资料实战部分大多都是单表的数据,也都是偏简单的一些需求。所以对 es 在实际项目中的使用方式有些疑惑点,希望大佬们可以指点一二。

问题 1

如果所涉及到的查询业务只有单表,为了减少业务代码的开发。目前了解到的中间件是 canal ,监听 binlog ,将数据同步到 ES 中。 想问下大家,实际使用中也是这种思路吗。

问题 2

如果涉及到多表关联查询,是不是只能通过业务代码往 ES 里面灌数据。 举个实际的场景: 比如:学生表 student 中有 id ,code ,name ,age ,address ,schoolname ,tel ... 等字段 年级表 class 中有 id ,name ...等字段 还有其他的一些基础数据表。

现在想实现一个学员列表的需求。 列表中,会以学生为维度,展示其他很多表中涉及到的字段。 搜索条件有:学员姓名,学员编码( code ),学校,入学时间等字段。

如果基于 mysql 实现,可能需要多张业务表关联查询,甚至有些字段可能一个 sql 查不出来,需要在查询出来的结果中遍历,单独再去查询某个字段,然后赋值。这样的话,表数据比较多查询效率很慢。

如果基于 ES 来实现,我的思路是:

  1. 写一个跑批接口,现将筛选条件需要的字段跟学生建立联系查询出来,组织成一条数据存入到 es 中,比如:学员 id ,姓名,编码,学校等。这样就可以将历史数据同步到 es 中了。
  2. 在新增修改删除基础表数据的地方,同步去修改 es 中的数据。
  3. 查询列表的时候,先去查 es 中的数据,再根据一个唯一值(比如学员 id ),然后根据唯一键查询 mysql 补足其他字段的值。

总结:查询字段放 es ,表格字段查 mysql

我不知道我的实现思路是否使用合理和正确。如果合理的话,感觉代码的侵入性太强了。比如上述问题二,如果修改了某个基础标的数据,我还要对应的修改 es 中的数据。可能系统里我都不知道都有哪些地方修改基础数据。

希望大家可以提供一些实际工作中应对以上场景时的解决思路。如果有一些参考的教程资料关于 es 的也可以提供。 感谢大家

1207 次点击
所在节点    问与答
8 条回复
brightzhuhl
2023-02-20 18:15:34 +08:00
单表一般不需要 ES 的,数据库做好索引就 ok

多表聚合的情况,肯定是需要单独的代码逻辑来查询数据库数据构建为 es 索引的。但是可以通过 mq 解耦。

目前我们这里使用 canal 还会定义一个通用的 mq 转发层,业务只需要定义好监听字段的规则,转发层会将 binlog 消息投递到对应的 mq 队列,应用代码监听队列之后再触发一个重新构建 es 的 mq 消息
TWorldIsNButThis
2023-02-20 18:32:27 +08:00
@brightzhuhl
我一直觉得 es 是用来应付对宽表各种字段 xjb 查的

这种场景下 mysql 索引根本建不过来
RedBeanIce
2023-02-20 18:45:19 +08:00
你是对的,至于代码里面的对象转 es ,可以发送 kafka 到 lodash ?或者什么的地方,可以直接塞到 es 里面去。
bugsnail
2023-02-20 18:50:30 +08:00
差不多是这样,像 1 楼说的,单表不需要上 ES

除非几百万数据单字段 like 模糊搜索
jiobanma
2023-02-21 09:17:45 +08:00
@brightzhuhl 您说的这个思路是不是这样的,多表聚合的时候,canal 监听 binlog ,发现数据变化,将 binlog 转发到 mq 中,然后业务代码监听 mq ,接收到消息编写对应的业务代码来维护 es 中的数据
jiobanma
2023-02-21 09:19:56 +08:00
@RedBeanIce lodash 是什么意思呀?
jiobanma
2023-02-21 09:20:17 +08:00
@bugsnail 谢谢大佬
gofocus
2023-05-18 18:01:18 +08:00
upup

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/917707

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX