[求讨论] 网易云音乐的搜索功能怎么做?

2017-09-02 14:27:20 +08:00
 fiht

以查找单曲《枫》为例

  1. 查找《枫》,热度高的自动置顶,没毛病。用 MySQL select like sort by 可以实现

  2. 然后匹配专辑 周杰伦的专辑置顶,其他的排在后面。

想问的:

  1. 后台数据库大概是个什么模型?
  2. 怎么实现的

问题空而广,但这个确实触及到我这个只会增差改删程序员的知识盲区了,求各位老板指教。希望能够甩出两个关键词我去学习学习。

或者实际一点

给你三张表,一个是专辑,一个是专辑中的歌曲,歌曲通过外键关联到专辑。以及各个歌曲的播放次数。怎么实现一套网易云音乐这样的搜索算法?

4387 次点击
所在节点    问与答
6 条回复
mpich
2017-09-02 15:37:54 +08:00
你要的关键词:Elasticsearch
bazingaterry
2017-09-02 17:37:07 +08:00
Elasticsearch + 1
fiht
2017-09-02 19:02:46 +08:00
@mpich @bazingaterry
根据 ElasticSearch 调整各个参数的权重占比吗?
mpich
2017-09-02 19:13:36 +08:00
@fiht 啥参数比?

你用 ES 的话需要根据索引,定义不同的 doc,每个 doc 可以定义一个自己的静态分,然后搜索的时候会有 bm25 或者 tfidf 做相关性分,可以让静态分和相关性分相乘。

举例来说,专辑是一个 index,歌也是一个 index,两个是不同的,专辑里面的 doc 可以是整张专辑里面所有的歌的信息,歌名,歌词之类的。静态分可以用你所能想到的所有关于这个 doc 的 feature。专辑发售年份,历史热门度,近期热门度,评论数量,点赞数量,是否有 mv,etc,这些 feature 需要根据你的业务场景和产品战略来决策和加权。静态分可以固定时间计算一次,然后重写索引。

你说的这个场景里面,应该是“枫”这个字虽然并没有出现在专辑 titile 里,但是出现了在了专辑所含有的歌曲信息里(专辑 index 里面的 doc 包含有歌曲信息),所以让这张专辑能够拥有足够的相关性分被检索到。

接着这张专辑的其他 feature,热门度,评论数,听过数目,被加到歌单的数目等等远超过其他,所以它不仅被检索到,还被排到了前面。
mpich
2017-09-02 19:15:50 +08:00
@fiht 不过,网易的检索肯定比我说的复杂,还有广告投放排序,feature 动态排序,特征层的矫正之类的,还会有检索用户(你)的使用习惯,用户 profile 之类的(这样才能每个人检索的排序不同)。不过我说的方案应该可以满足你的需求。
fiht
2017-09-02 19:33:12 +08:00
@mpich 多谢大佬

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

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

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

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

© 2021 V2EX