V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
jiobanma
V2EX  ›  问与答

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

  •  
  •   jiobanma · 2023-02-20 17:48:54 +08:00 · 932 次点击
    这是一个创建于 430 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景:项目重构,有些负责查询想要上 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 的也可以提供。 感谢大家

    8 条回复    2023-05-18 18:01:18 +08:00
    brightzhuhl
        1
    brightzhuhl  
       2023-02-20 18:15:34 +08:00
    单表一般不需要 ES 的,数据库做好索引就 ok

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

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

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

    除非几百万数据单字段 like 模糊搜索
    jiobanma
        5
    jiobanma  
    OP
       2023-02-21 09:17:45 +08:00
    @brightzhuhl 您说的这个思路是不是这样的,多表聚合的时候,canal 监听 binlog ,发现数据变化,将 binlog 转发到 mq 中,然后业务代码监听 mq ,接收到消息编写对应的业务代码来维护 es 中的数据
    jiobanma
        6
    jiobanma  
    OP
       2023-02-21 09:19:56 +08:00
    @RedBeanIce lodash 是什么意思呀?
    jiobanma
        7
    jiobanma  
    OP
       2023-02-21 09:20:17 +08:00
    @bugsnail 谢谢大佬
    gofocus
        8
    gofocus  
       343 天前
    upup
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1185 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 23:06 · PVG 07:06 · LAX 16:06 · JFK 19:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.