Coreseek®  
 | 首页 | 注册 | 回复 | 搜索 | 统计资料 |                 网站首页产品服务开放源码安装使用常见问题中文手册社区交流联系我们 
案例展示/经验分享 论坛首页 / 案例展示/经验分享 /

用coreseek的倒排轻松搞定“好友的文章”类相关推荐功能

 
54chen
会员
#1 | 发表时间: 2010 09 07 09:31 | 修改: 54chen
回复 
用coreseek的倒排轻松搞定“好友的文章”类相关推荐功能

在SNS网站中,“好友的相册”、“好友的日志”、“好友常去的小组”,这样的功能到处都是,如果处理不当,对整个系统的压力都会非同小可。
这里介绍一种利用sphinx的搜索天性,倒排索引群中的人,然后把好友的XX功能化解为或关系的搜索,下面是是一些记录。关于sphinx的安装,详细见54chen之前的一些手记:http://www.54chen.com/tag/sphinx
第一步,制造随机数据
这里为方便理解,作一个假设的场景,要索引的字段缩减到2个字段,字段1是目标id,表示相册id\日志id\小组id等等,字段2是一个text,里面以逗号隔开记录了所有的和这个目标id有关系的人的id号,大致如下所示:

id members
1 1,2,3,4,5,6

这样一个表,标识了id为1的一个目标,都有什么用户和他有关。比如可以表示:id为1的群都有12345这五个人加过;id为1的相册都有12345这五个人看过;id为1的相册都有12345这五个人回复过,等等。
下面代码片段所做之事,是将10万条记录插入到表中,表的members的记录在五千条内随机,里的人id从1到50000随机产生,这样,基本能够模拟一个中型应用的水平了。

    $db = new DLConnection();
    $sql = “INSERT INTO `forum`.`forum_info` (`id` ,`members`)VALUES”;
    $dot = “”;
    for ($i=0;$i<100000;$i++)
    {
    $dot2 = "";
    $sql2 = "";
    for ($j=0;$j
    $x = rand(1,50000);
    $sql2 .= $dot2.$x;
    $dot2 = ",";
    }
    $sql .= $dot."('$i', '$sql2')";
    $dot = ",";

    if ($i%1000==0) {
    $db->Execute($sql);
    $sql = “INSERT INTO `forum`.`forum_info` (`id` ,`members`)VALUES”;
    $dot = “”;
    }
    }

第二步,压力测试搜索性能
代码太长不帖了,使用java开启100个线程100个连接到sphinx,sphinx建立索引后,只起一个节点。
搜索的时候,关键的几点:
1. int mode = SphinxClient.SPH_MATCH_BOOLEAN; 使用布尔方式查询
2.随机产生1到1000个用户id,id为1到50000之间的随机一个,多个之间用|(或)连接

结论
sphinx的搜索性能还是基本满意,在压力测试的时候看后台的query log可以发现,绝大多数的查询在100ms左右,当然,因为随机的原因,也会出现一些3秒5秒的查询,但这是个案,在普通用户中出现的可能性不大。
此方案的适用性正在进一步优化中。

欢迎围观
www.54chen.com/web-ral/search-friends-airticle-function.html
54chen
会员
#2 | 发表时间: 2010 09 07 09:33
回复 
标题不能修改 郁闷
HonestQiao
会员
#3 | 发表时间: 2010 09 07 11:10
回复 
修改了,不错!

希望大家越用越好!
 
回复
Bold Style  Italic Style  Image 链接  URL 链接 
发帖注意:
  • 网址中请去掉http://开头,例如:您需要输入www.coreseek.cn,而不是http://www.coreseek.cn
  • 咨询问题,请贴出详细的操作系统版本、Coreseek版本(Linux环境请给出编译参数)
  • 请仔细查看中文手册和本站安装指南,确认操作正确
  • 请仔细查看常见问题解答,也许你的问题已经有解决方法

» 帐号  » 密码 
您只输入了昵称,没有输入密码,如果没有ID,请申请一个.