跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 像 pixiv 那种根据标签搜索图片的功能,后端是怎么做得?
未分類
18 4 月 2021

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

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

資深大佬 : Nillouise 8

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

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

大佬有話說 (11)

  • 資深大佬 : leoleoasd

    假设有个 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

    不一定完全对,大概这个样子

  • 資深大佬 : leoleoasd

    稍微改一下就可以查 “有指定 5 个 tag 中 3 个或以上的” 图片等高级搜索

  • 主 資深大佬 : Nillouise

    @leoleoasd 这样性能上能满足要求吗?看着功能确实是可以这样实现的,但 pixiv 少说也有 10 个 tag 以上,后面的子查询可以查出 10w 的 image_id,我有点怀疑能不能在 1s 内返回。
    不过如果分库分表+很多个读副本的话,应该也能提高很多性能吧,看起来之前我有点思维误区了。

  • 資深大佬 : leoleoasd

    @Nillouise #4 性能不太清楚,只知道这样可以实现,没有真正实践过

  • 資深大佬 : Soar360

    pgsql 的 gin 倒排索引了解下?

  • 資深大佬 : eason1874

    MySQL 能做,用 MySQL 的 WordPress 不就可以这样么。

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

    relationships 表有 post_id 和 term_id,连表查询就行了,单标签多标签都一样查,我做过,只是当时数据少,不知道数据多了性能怎么样。

  • 資深大佬 : superrichman

    搞张中间关系表就能做了

  • 資深大佬 : dd112389

    三张表, 用表连接查, 不用子查询.
    建立合适的索引, 连接查询能缩小范围的条件写前面.
    (最好先查询小表).

  • 資深大佬 : moen

    在某个 pixiv 员工的[基础设施介绍]( https://speakerdeck.com/konoiz/pixivniokerumysqlyun-yong-falseshi-ji?slide=13)里可以看到他们搜索是用 Solr 来实现的

  • 資深大佬 : SjwNo1

    如果用中间表的话,此表膨胀速度太快了~

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具