我正在尝试创建一个系统,能够找到与用户拥有类似喜爱电影/书籍/兴趣等的其他用户,就像last.fm上的邻居一样。共享最多兴趣的用户将具有最高匹配度,并在用户资料中显示(如5个最佳匹配)。
有没有任何相对较快的方法来实现这一点?显而易见的解决方案是创建一个包含用户ID和兴趣ID的表格,并将一个用户与所有其他用户进行比较,但在每个拥有20个兴趣的百万用户表格上这将花费很长时间。
我认为一些有效的解决方案存在,因为last.fm运行得非常好。我更喜欢使用像mySQL或pgSQL这样的常见SQL数据库,但任何东西都可以。
感谢您的建议。
更新: 事实证明,在SQL数据库中查找最近邻居是最大的问题,因为没有开源数据库支持这种搜索。 因此,我的解决方案是修改ANN以作为服务运行,并从PHP查询它(例如使用套接字)-即使在内存中拥有数百万用户,每个用户具有7个维度,也不是什么大问题,速度非常快。
对于较小的数据集,另一种解决方案是使用以下简单查询:
有没有任何相对较快的方法来实现这一点?显而易见的解决方案是创建一个包含用户ID和兴趣ID的表格,并将一个用户与所有其他用户进行比较,但在每个拥有20个兴趣的百万用户表格上这将花费很长时间。
我认为一些有效的解决方案存在,因为last.fm运行得非常好。我更喜欢使用像mySQL或pgSQL这样的常见SQL数据库,但任何东西都可以。
感谢您的建议。
更新: 事实证明,在SQL数据库中查找最近邻居是最大的问题,因为没有开源数据库支持这种搜索。 因此,我的解决方案是修改ANN以作为服务运行,并从PHP查询它(例如使用套接字)-即使在内存中拥有数百万用户,每个用户具有7个维度,也不是什么大问题,速度非常快。
对于较小的数据集,另一种解决方案是使用以下简单查询:
SELECT b.user_id, COUNT(1) AS mutual_interests
FROM `users_interests` a JOIN `users_interests` b ON (a.interest_id = b.interest_id)
WHERE a.user_id = 5 AND b.user_id != 5
GROUP BY b.user_id ORDER BY mutual_interests DESC, b.user_id ASC
平均每个用户拥有约20个兴趣(共有10,000种可能的兴趣),当100,000个用户同时在线时,响应时间为20-50毫秒。