fiht
V2EX  ›  问与答

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

  •  
  •   fiht · Sep 2, 2017 · 4823 views
    This topic created in 3209 days ago, the information mentioned may be changed or developed.

    以查找单曲《枫》为例

    1. 查找《枫》,热度高的自动置顶,没毛病。用 MySQL select like sort by 可以实现 http://ww2.sinaimg.cn/large/0062TDWsgy1fj56y6dr6xj318m0eamzv.jpg

    2. 然后匹配专辑 http://ww2.sinaimg.cn/large/0062TDWsgy1fj5714w6ctj31920kwjvk.jpg 周杰伦的专辑置顶,其他的排在后面。

    想问的:

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

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

    或者实际一点

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

    6 replies    2017-09-02 19:33:12 +08:00
    mpich
        1
    mpich  
       Sep 2, 2017   ❤️ 1
    你要的关键词:Elasticsearch
    bazingaterry
        2
    bazingaterry  
       Sep 2, 2017   ❤️ 1
    Elasticsearch + 1
    fiht
        3
    fiht  
    OP
       Sep 2, 2017
    @mpich @bazingaterry
    根据 ElasticSearch 调整各个参数的权重占比吗?
    mpich
        4
    mpich  
       Sep 2, 2017   ❤️ 1
    @fiht 啥参数比?

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

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

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

    接着这张专辑的其他 feature,热门度,评论数,听过数目,被加到歌单的数目等等远超过其他,所以它不仅被检索到,还被排到了前面。
    mpich
        5
    mpich  
       Sep 2, 2017
    @fiht 不过,网易的检索肯定比我说的复杂,还有广告投放排序,feature 动态排序,特征层的矫正之类的,还会有检索用户(你)的使用习惯,用户 profile 之类的(这样才能每个人检索的排序不同)。不过我说的方案应该可以满足你的需求。
    fiht
        6
    fiht  
    OP
       Sep 2, 2017
    @mpich 多谢大佬
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3197 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 12:39 · PVG 20:39 · LAX 05:39 · JFK 08:39
    ♥ Do have faith in what you're doing.