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

2021-04-03 11:48:52 +08:00
 Nillouise

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

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

2902 次点击
所在节点    程序员
11 条回复
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
2021-04-03 12:11:01 +08:00
不一定完全对,大概这个样子
leoleoasd
2021-04-03 12:11:49 +08:00
稍微改一下就可以查 “有指定 5 个 tag 中 3 个或以上的” 图片等高级搜索
Nillouise
2021-04-03 13:04:07 +08:00
@leoleoasd 这样性能上能满足要求吗?看着功能确实是可以这样实现的,但 pixiv 少说也有 10 个 tag 以上,后面的子查询可以查出 10w 的 image_id,我有点怀疑能不能在 1s 内返回。
不过如果分库分表+很多个读副本的话,应该也能提高很多性能吧,看起来之前我有点思维误区了。
leoleoasd
2021-04-03 13:09:22 +08:00
@Nillouise #4 性能不太清楚,只知道这样可以实现,没有真正实践过
Soar360
2021-04-03 13:26:47 +08:00
pgsql 的 gin 倒排索引了解下?
eason1874
2021-04-03 13:29:36 +08:00
MySQL 能做,用 MySQL 的 WordPress 不就可以这样么。

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

relationships 表有 post_id 和 term_id,连表查询就行了,单标签多标签都一样查,我做过,只是当时数据少,不知道数据多了性能怎么样。
superrichman
2021-04-03 14:51:56 +08:00
搞张中间关系表就能做了
dd112389
2021-04-03 16:09:16 +08:00
三张表, 用表连接查, 不用子查询.
建立合适的索引, 连接查询能缩小范围的条件写前面.
(最好先查询小表).
moen
2021-04-03 16:44:57 +08:00
SjwNo1
2021-04-03 17:42:14 +08:00
如果用中间表的话,此表膨胀速度太快了~

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

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

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

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

© 2021 V2EX