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

像 pixiv 那种根据标签搜索图片的功能,后端是怎么做得?

  •  
  •   Nillouise · 2021-04-03 11:48:52 +08:00 · 2929 次点击
    这是一个创建于 1341 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一张图有多个标签,一个标签可以搜索出多张图,同时搜索还能返回总的数量(这样才可以进行分页吧?),标签之间可以组合搜索,mysql 应该做不了这种需求,那就是用 elastic 做的?但 elastic 支持这种分页功能?而且我印象中 elastic 搜索不快(用 kibana 搜后端 log 几秒延迟),能做成这么高性能?

    有点好奇这种常用功能是怎么实现的。

    11 条回复    2021-04-03 17:42:14 +08:00
    leoleoasd
        1
    leoleoasd  
       2021-04-03 12:10:53 +08:00
    假设有个 image 表,和 image has tag 表,那 mysql 查询有 3 个指定 tag 的语句就是
    select * from images where id in (select image_id from image_has_tag where tag_name = '1' or tag_name = '2' or tag_name = '3' grouping by image_id having count(*) = 3)
    leoleoasd
        2
    leoleoasd  
       2021-04-03 12:11:01 +08:00
    不一定完全对,大概这个样子
    leoleoasd
        3
    leoleoasd  
       2021-04-03 12:11:49 +08:00
    稍微改一下就可以查 “有指定 5 个 tag 中 3 个或以上的” 图片等高级搜索
    Nillouise
        4
    Nillouise  
    OP
       2021-04-03 13:04:07 +08:00
    @leoleoasd 这样性能上能满足要求吗?看着功能确实是可以这样实现的,但 pixiv 少说也有 10 个 tag 以上,后面的子查询可以查出 10w 的 image_id,我有点怀疑能不能在 1s 内返回。
    不过如果分库分表+很多个读副本的话,应该也能提高很多性能吧,看起来之前我有点思维误区了。
    leoleoasd
        5
    leoleoasd  
       2021-04-03 13:09:22 +08:00
    @Nillouise #4 性能不太清楚,只知道这样可以实现,没有真正实践过
    Soar360
        6
    Soar360  
       2021-04-03 13:26:47 +08:00
    pgsql 的 gin 倒排索引了解下?
    eason1874
        7
    eason1874  
       2021-04-03 13:29:36 +08:00
    MySQL 能做,用 MySQL 的 WordPress 不就可以这样么。

    图片跟文章一样在 posts 表,标签在 terms 表,图片和标签的关系在 relationships 表。

    relationships 表有 post_id 和 term_id,连表查询就行了,单标签多标签都一样查,我做过,只是当时数据少,不知道数据多了性能怎么样。
    superrichman
        8
    superrichman  
       2021-04-03 14:51:56 +08:00 via iPhone
    搞张中间关系表就能做了
    dd112389
        9
    dd112389  
       2021-04-03 16:09:16 +08:00
    三张表, 用表连接查, 不用子查询.
    建立合适的索引, 连接查询能缩小范围的条件写前面.
    (最好先查询小表).
    moen
        10
    moen  
       2021-04-03 16:44:57 +08:00   ❤️ 1
    SjwNo1
        11
    SjwNo1  
       2021-04-03 17:42:14 +08:00 via iPhone
    如果用中间表的话,此表膨胀速度太快了~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1020 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 19:54 · PVG 03:54 · LAX 11:54 · JFK 14:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.