社交app如何做多维度的个性化推荐?

新手上路,请多包涵

现在,个性化推荐几乎是社交软件的标配了,尤其是基于地理位置、兴趣爱好、在线状态等多维度的个性化推荐。

我对这个应用场景的实现非常感兴趣,自己也在尝试实现。我之前也请教过基于地理位置的实现方案http://www.zhihu.com/question/32205786,应该说,PostgreSQL是最好的方案。不过由于一些原因(比如阿里云最近才支持PostgreSQL,
而且目前还没有在海外节点部署),所以我最终选择的方案是MySQL + ElasticSearch(简称ES)。

需求大概是这样的:
1. 可以对每一个用户进行多维度的个性化推荐,并且可以设置不同维度的比例,比如:地理位置:兴趣爱好:在线状态=7:2:1;
2. 推荐用户具有不重复性:如果样本足够,推荐应该是不重复的;如果样本不够,则推荐的用户在一段时间(比如一周)内是不重复的;

我初步的方案并没有优雅地解决问题,这里仅抛砖引玉,希望能得到大家的意见,开阔一下思路:

  1. 将用户数据导入到ES中,可以基于地理位置、模糊查询、精确查询等做多维度的推荐,不同维度推荐出来的数据需要排重;
  2. 给每一个用户维护一个推荐过的用户列表,将待推荐的用户去该缓冲表里排重后,然后确定各维度的推荐比例后返回;
  3. 如果推荐过的用户需要一段时间后过期,可以使用定时任务定时扫描推荐过的用户列表并过期;

不过,该方案存在的问题有:

  1. 如果去单独的缓冲表里排重,则每次从ES中查询数据的偏移量无法确定(尤其是考虑到过期后的数据又可以被重新推荐),这一点我还没想到比较好的方案;
  2. 每次从ES中查询出来的数据,都需要一一去缓冲表里排重,当缓冲表越来越大,排重的效率会降低;可以考虑将缓冲表放到缓存里(如redis),应该问题不大;

请大家指点(不仅限于上面的方案),尤其是有过类似经验的朋友,谢谢!!!

阅读 4k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题