日期:2014-05-17  浏览次数:20499 次

社交平台好友推荐系统设计(类似搜索引擎排名 求指导)
我现在想为社区添加一个功能,就是好友推荐系统

根据某个用户的地区和性别 等自己的属性推荐特定的好友

我以前的做法是
比如登录用户为‘张三’男的 我要推荐相同地区的女的。

SQL语句:

select 地区 into @area,性别 into @sex from 用户表 where 姓名='张三'
select * from 用户表 where 地区=@area and 性别=相反@sex and 姓名 in(最近登录1w用户) limit 300



{最近登录的用户} 
这个集合我每半个小时计算的最近登录的1w个用户,然后放到缓存。(这样做虽然不合适,但是如果将用户登录表和用户表join,速度很慢,)

如下。是我以前的做法,发现排序很慢
SQL code

select * from 用户表 left join 登录表 on 用户表.姓名=登录表.姓名 where 地区=@area and 性别=相反的@sex  order  by 最近登陆日期 DESC limit 300;


得到的结果集合
还需要计算张三和她们之间的年龄差距计算排序( 根据权重排序 )

如 张三 和  王晓燕 的年龄差距为 1岁,权重为 50。

--------------分割线-----------------------------------------------------

我以前这样做每次一个用户发起请求都要执行SQL 和计算,觉得不太合适,所有该有的索引都有了。

我想用sphinx,但是我这个推荐本书就是依据字段属性来区分的,所以觉得也有点不合适,

在这里想问问有什么成熟的方案没有 。
搜索引擎 SQL

------解决方案--------------------
顶贴



------解决方案--------------------
算法整体看没什么大问题,建议:
1.{最近登录的用户} 这个集合每半个小时计算最近登录的1w个用户,然后存为表.
2.查询时应避免使用"select *",尽量仅将需要返回的字段列出来.

------解决方案--------------------
--下面这样查询300条应该会比较快
select TOP(300) * 
from 用户表 a
INNER join 最近登录的用户 b
on a.姓名=b.姓名 --姓名创建索引
where a.地区=@area and a.性别=相反的@sex
order by b.最近登陆日期 DESC --最近登陆日期,创建索引