V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sbhhhhhh
V2EX  ›  Elasticsearch

请教一个 ElasticSearch 相关的业务问题

  •  
  •   sbhhhhhh · 290 天前 · 2456 次点击
    这是一个创建于 290 天前的主题,其中的信息可能已经有所发展或是发生改变。

    功能简述:我们有一批数据存在 ES 上(每个数据有一个唯一 ID ),然后每个用户可以对这个数据进行转存(转存后会在 mysql 记录一条 userId 与数据 ID 的关系)。 用户 ID 长度为 14 字符长度。

    对客提供搜索功能,其中有一个过滤条件是过滤用户已转存数据。 现在问题是如果有 2000 个用户都对同一个数据进行了转存 那该怎么实现这个方案呢? 最开始我想的是在 ES 上加一个转存用户 ID 列表 但是如果 2000 个用户都正好在一个热点数据上 岂不是这个字段需要挂一个 2000 个元素的列表,好像不太好?

    所以请教各位大佬 行业有什么标准方案吗 或者有推荐的思路

    16 条回复    2024-03-07 19:15:55 +08:00
    N9f8Pmek6m8iRWYe
        1
    N9f8Pmek6m8iRWYe  
       290 天前
    es 不适合用在这个场景
    luckyxl
        2
    luckyxl  
       290 天前
    先通过 mysql 查出和用户相关的数据 id,再通过这些 id 去查 ES
    sbhhhhhh
        3
    sbhhhhhh  
    OP
       290 天前
    @luckyxl 拿出数据 ID 然后在 ES 里面去 not in 吗? 但是一个用户有可能转存了 10w 个数据 也没法全部去 in 吧?
    sbhhhhhh
        4
    sbhhhhhh  
    OP
       290 天前
    @stevenchengmask 大佬有什么通用方案吗 主要是目前数据选型已经是 es 了 看看有没有什么可用的方案
    gadfly3173
        5
    gadfly3173  
       290 天前 via Android   ❤️ 2
    听起来是类似于找出我没有关注的 up 主一类的需求,你可以参考一下 b 站的这个 https://www.bilibili.com/read/cv24151036/

    或者如果是可以不用严格分页/显示页码的情况的话,可以考虑每次按照特定排序拉 1.5 倍需要的数据,从拿出来的数据里在过滤掉已经转存过的,数据量不够的话再查一次,分页就根据 id 而不是页码来
    Exception615
        6
    Exception615  
       290 天前
    在进行 [转存] 前可以把 [数据 ID+用户 ID 这条转存记录] 记到布隆过滤器里
    Jinnrry
        7
    Jinnrry  
       290 天前 via Android
    数据量多少?用户量多少?查询 QPS 多少?仅仅是 2000 个用户的话,数据上面加个字段存用户 id 没有任何问题,用户 id 用逗号或者空格分词
    sbhhhhhh
        8
    sbhhhhhh  
    OP
       290 天前
    @gadfly3173 好的非常感谢~
    sbhhhhhh
        9
    sbhhhhhh  
    OP
       290 天前
    @Jinnrry ES 上的数据差不多 2000 万,用户量在 1w 以内 查询 qps 可以做限制 比如 200 内 100 内。主要是考虑一个用户 ID 的长度为 14 字符 如果有 2000 个 那么长度是不是太长了导致 ES 的文档占用太多空间?
    sbhhhhhh
        10
    sbhhhhhh  
    OP
       290 天前
    @Exception615 那查询时怎么做 [未转存过]的过滤呢 内存做过滤吗
    Jinnrry
        11
    Jinnrry  
       290 天前 via Android   ❤️ 1
    @sbhhhhhh 完全不会,你太小看 es 了。用户 id 字段分词后会变成倒排索引,不会有重复的存储消耗。1 万个 id 的空间消耗远低于 2000 万篇 1 万字的文章索引。

    这点数据量对 es 来说完全就是毛毛雨
    sbhhhhhh
        12
    sbhhhhhh  
    OP
       290 天前
    @Jinnrry 那么也就是说,现有 2000 万数据的一个索引上,我增加一个[已转存用户列表]字段,用户 ID 长度 14 字符,通过空格或者逗号拼接做成倒排索引,完全可以支持 1 万个 ID 挂上去。 听大佬这么说,貌似是的,对 ES 不是很了解 这个我再去瞅瞅,感谢大佬。
    Jinnrry
        13
    Jinnrry  
       290 天前 via Android
    @sbhhhhhh 这个字段记得手动指定分词器,指定逗号分词器或者空格分词器,不然你查询会出问题
    sbhhhhhh
        14
    sbhhhhhh  
    OP
       290 天前
    @Jinnrry 好的 感谢!
    1018ji
        15
    1018ji  
       289 天前
    用户数组就是了,就 1w 用户感觉也就那样

    实在不行就父子文档了
    Exception615
        16
    Exception615  
       289 天前
    @sbhhhhhh #14 是的 楼上说的对~ 我昨天没说详细,布隆过滤器用 bitmap 实现的映射,空间消耗很少,适合做大数据量下的过滤判断哈
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2782 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 13:02 · PVG 21:02 · LAX 05:02 · JFK 08:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.