用搜索的倒排轻松搞定“好友的文章”类相关推荐功能
在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秒的查询,但这是个案,在普通用户中出现的可能性不大。
此方案的适用性正在进一步优化中。
建议继续学习:
- 怎样用好Google进行搜索 (阅读:14795)
- 淘宝搜索:定向抓取网页技术漫谈 (阅读:8277)
- 简析搜索引擎中网络爬虫的搜索策略 (阅读:6057)
- 几种常见的基于Lucene的开源搜索解决方案对比 (阅读:4703)
- 用Sphinx快速搭建站内搜索功能 (阅读:4480)
- 基于用户行为分析的搜索引擎自动性能评价 (阅读:4469)
- 互联网网站的反爬虫策略浅析 (阅读:4198)
- 附近地点搜索初探 (阅读:4200)
- 百度搜索URL参数解析 (阅读:4160)
- Xapian搜索体系结构 (阅读:4094)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:54chen 来源: 五四陈科学院
- 标签: 倒排 推荐 搜索
- 发布时间:2010-09-06 08:46:04
- [3999] QR码分析
- [68] Twitter/微博客的学习摘要
- [67] Go Reflect 性能
- [66] 【社会化设计】自我(self)部分――欢迎区
- [66] Oracle MTS模式下 进程地址与会话信
- [63] 流程管理与用户研究
- [63] IOS安全–浅谈关于IOS加固的几种方法
- [62] 如何拿下简短的域名
- [62] 图书馆的世界纪录
- [59] android 开发入门