Home  >  Article  >  Backend Development  >  「相关文章」结果是越相关排名越前的案例,求一个高效的写法

「相关文章」结果是越相关排名越前的案例,求一个高效的写法

WBOY
WBOYOriginal
2016-06-23 13:50:49692browse

我的文章系统,想按照多个件条下
,看看有什么可能性可做到

4张表  基础简介
content 文章主表
id
lid = 相关的文集id ,保存格式 (1,2,3)
tags = 相关的TAG 的ID   ,保存格式 (1,2,3)
typeid = 分类ID 只为1个数字 
文集
lid
name

Tags
id
name
分类
typeid
name

typeid = 分类ID, 不别多说
tag = 标签这不用多说,
lid = 一个文集, 但一篇文章可以放到多个文集, 比如: PHP+MYSQL+AJAX无刷新评论
用户可能放到  PHP文集,MYSQL文章,AJAX文集

TAG 是全站共用,重复就不新增,只会选择  
所以不能做成一个自己文章的分类列表,所以会出现了文集功能


因为文章某个部分已经会显示当前文集其他的文章

所以在关相文章的部分,文集中的文件不比TAG文章更应该排在前面

所以准备的关系排名是
1. TAG相关
2. 文集
3. 最新的当前分类文章

为什么要分3次???

因为我就是怕太TAG,同时又没有用到文集功能....
所以最后一步才是当前分类文章



当前文章的
TAG 是3,14
lid = 7,12
typeid = 2

SELECT * FROM `content` WHERE `tags` IN (3,14) ORDER BY `time` DESC LIMIT 10
SELECT * FROM `content` WHERE `lid` IN (7,12) ORDER BY `time` DESC LIMIT 10
SELECT * FROM `content` WHERE `typeid` = '2' ORDER BY `time` DESC LIMIT 10


前台显示十条相关文章
本来是准备,分3次,然后每次拿10条是最安全的

后来想想...这样还有合并数组什么的也麻烦,重点是取太多资料,但前台只需要10条

所以换成一句
SELECT * FROM `video_content` WHERE `tags` IN (3,14) or `lid` IN (3) or `typeid` = 2  LIMIT 10

但这样好像又能以TAG>文集>分类...去排名

请求一下有何方法?

要求好像蛮麻烦的呵呵,因为页面下半部有50%的部分是显示相关文章,所以在营运上很重要


回复讨论(解决方案)

暂时用了这一段代码,感觉有点蠢

有什么更好的方法建议呢?

//相关文章if (!empty($data["tags"]) || !empty($data["lid"])) {	$tags = $data["tags"];	$lid = $data["lid"];	$tag_sql = "SELECT * FROM `content` WHERE `tags` IN ($tags) OR `lid` IN ($lid) ORDER BY `time` DESC LIMIT 8";	$stmt = $pdo->prepare($tag_sql);	$stmt->execute();	$tags_v = $stmt->fetchAll(PDO::FETCH_ASSOC);	$smarty -> assign("r_v",$tags_v);}$tags_num = count($tags_v);if ($tags_num < 8 ) {	$now_v = "";	foreach ($tags_v as $key => $value) {  		$now_v .= $value['vid'].",";	}		$now_v=substr("$now_v",0,-1);	$need = 8-$tags_num;	$typeid = $data["typeid"];	$typeid_sql = "SELECT * FROM `content` WHERE `typeid` = '$typeid' AND  `vid` NOT IN ($now_v) ORDER BY `time` DESC LIMIT $need";	$stmt = $pdo->prepare($typeid_sql);	$stmt->execute();	$typeid_v = $stmt->fetchAll(PDO::FETCH_ASSOC);	$smarty -> assign("r_tv",$typeid_v);}

sql用or、not in本来就不好;
如果数据不需要太及时的话
把你3条sql语句组合好的数据缓存一段时间(半小时、一小时、甚至再长一点也可以)
因为你的数据都是死数据,没有浏览量,评论量等等

sql用or、not in本来就不好;
如果数据不需要太及时的话
把你3条sql语句组合好的数据缓存一段时间(半小时、一小时、甚至再长一点也可以)
因为你的数据都是死数据,没有浏览量,评论量等等

谢谢
这个我也了解

但更想知道的是,如果按照更有关的排得更前

就是先排TAG 再排LID  最后再排同类其他文章

莫非只能用二楼的方法?

你的 意思是不是如果要10条tag,就先取10条tag,不够再取有lib,接着不够再取有type的?

如果是这样的话, 你的sql是不是会有问题!

你的 意思是不是如果要10条tag,就先取10条tag,不够再取有lib,接着不够再取有type的?

如果是这样的话, 你的sql是不是会有问题!


是的

2楼暂时做了个简单的
暂时先不分tag和lid

不够再取type
以及2楼用8条做测试

是否有更好的做法?

用全文检索来做

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn