如果按照两篇文章匹配的关键字格式来选择相关文章,那么对于一篇有5个标签的文章,那么应该按照匹配5个标签、匹配4个标签一直找下去,这样的话最坏的情况就是对全站的文章进行多次查找匹配关键字,性能会很差,请问做相关文件推荐采用的一般性方法是怎样的?
其实比较标签匹配数量是很简单的做法,有很多更好的匹配办法,比如余弦相似性。
就LZ的这个问题,我特地看了一下用了几年却没自己看过的 WordPress Related Posts 插件。貌似它也也仅仅是每次都向数据库做SQL query,并没有做别的优化。
当然,并不是如LZ所说一次又一次地查找,而是只做一次 query,按从匹配 tag 数量从多到少做一个 ORDER BY
而已。
也就是说,把所有的逻辑都丢给数据库去处理,而不是自己处理。
==== 更新 ====
比如你有posts
表和tag_relationships
表。tag_relationship
表有两个field:tag_id
和 post_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。但这样做应该更慢。