使用PHP和MySQL创建相关或类似的帖子

2022-08-31 00:24:18

我正在环顾SO,想知道我将如何创建一个相关或类似的帖子,以使用PHP和MySQL在我的网站上显示?如何做到这一点的基本示例是什么?


答案 1

使用 MySQL 全文搜索 MATCH (col1,col2,...)反对 (expr [search_modifier]) 的事情。

假设您的表格是,您需要查找有关当前帖子标题的相关帖子。像这样做:articles

SELECT *, MATCH(title, body) AGAINST('$CurrentPostTitle') AS score
FROM articles 
WHERE MATCH(title, body) AGAINST('$CurrentPostTitle') 
ORDER BY score DESC LIMIT 5

这将为您提供前5个相关帖子。

但首先要记住,通过运行以下查询,为该表的列启用全文搜索:

ALTER TABLE articles ADD FULLTEXT (title, body);

[编辑]:为什么不使用喜欢对OP的澄清:

因为它不会给出正确的结果。假设您当前的标题是“1980年的音乐”,并且您希望对此发表相关文章。现在,如果您使用,则只会显示完全包含“1980年音乐”一词序列的帖子。但是,如果您使用 ,则将显示包含 Music OR 1980 的帖子。此外,同时包含音乐和1980的帖子将显示在顶部,因为它为每个结果提供了a,并且我们按该分数进行排序。我希望这很清楚。LIKEMATCH ... AGAINSTSCORE

[编辑]: 2

如果您有类别,则可以添加 SQL 查询以获取更具体的结果。AND Category = '$CurrentCategory'where clause

[编辑]:3:OP不能使用全文

如果您无法使用全文(出于某种原因),则可以只显示同一类别的5个随机帖子。由于它们属于同一类别,因此它们至少以某种方式相关:

SELECT *
FROM articles 
WHERE Category = '$CurrentCategory'
LIMIT 5

编辑的语法:在MySQL代码中将LIMTI更改为LIMIT


答案 2

在大多数情况下,您需要为匹配列提供不同的权重。您可以通过以下方式执行此操作:

SELECT 
    *, 
    ROUND(0 + 
               (MATCH(title) AGAINST('$CurrentPostTitle') * TITLE_WEIGHT) +
               (MATCH(body) AGAINST('$CurrentPostTitle') * BODY_WEIGHT)) AS score
FROM 
    articles 
HAVING 
    score > 0 
ORDER BY 
    score DESC 
LIMIT 5

只需将TITLE_WEIGHT和BODY_WEIGHT替换为整数的权重即可。

这样工作,您需要将全文添加到每列:

ALTER TABLE articles ADD FULLTEXT (title);
ALTER TABLE articles ADD FULLTEXT (body);

如果是这种情况,请不要忘记从结果中排除当前帖子。您可以使用 WHERE 条件执行此操作,然后再使用如下所示:

WHERE id <> $CurrentPostId

推荐