首页 > 根据标签计算文章相关度的问题?

根据标签计算文章相关度的问题?

如果按照两篇文章匹配的关键字格式来选择相关文章,那么对于一篇有5个标签的文章,那么应该按照匹配5个标签、匹配4个标签一直找下去,这样的话最坏的情况就是对全站的文章进行多次查找匹配关键字,性能会很差,请问做相关文件推荐采用的一般性方法是怎样的?


其实比较标签匹配数量是很简单的做法,有很多更好的匹配办法,比如余弦相似性。

就LZ的这个问题,我特地看了一下用了几年却没自己看过的 WordPress Related Posts 插件。貌似它也也仅仅是每次都向数据库做SQL query,并没有做别的优化。

当然,并不是如LZ所说一次又一次地查找,而是只做一次 query,按从匹配 tag 数量从多到少做一个 ORDER BY 而已。

也就是说,把所有的逻辑都丢给数据库去处理,而不是自己处理。

==== 更新 ====

比如你有posts表和tag_relationships表。tag_relationship表有两个field:tag_idpost_id

那么当你要查询post_id = 5的post的related posts时,你先 SELECT tag_id FROM tag_relationships WHERE post_id = 5

假设结果是2, 3, 5, 7, 11这几个tag。

那么你接下来就SELECT posts.post_id, COUNT(tag_relationships.tag_id) as cnt FROM posts, tag_relationships WHERE posts.post_id = tag_relationships.post_id AND tag_relationships.tag_id IN (2, 3, 5, 7, 11) GROUP BY tag_relationships.post_id ORDER BY cnt DESC

(当然,这样搜出来会包含这个这个post自身;要不包含它自己,WHERE里面再加一个posts.post_id <> 5就行了)

另外,这个方法实际上做了两次 query;实际上,如果多再多 join 一下的话,甚至一个 query 就可以搞定。比如

SELECT pt.post_id, COUNT(DISTINCT prt.tag_id) AS cnt FROM post p0, post pt, tag_relationships pr0, tag_relationships prt WHERE p0.post_id = 5 AND p0.post_id = pr0.post_id AND prt.tag_id = pr0.tag_id AND prt.post_id = pt.post_id AND p0.post_id <> pt.post_id GROUP BY pt.post_id ORDER BY cnt

其中5是原文章的id。但这样做应该更慢。

【热门文章】
【热门文章】