使用PHP和MySQL创建基于标记的相关链接功能

使用PHP和MySQL创建基于标记的相关链接功能,php,mysql,regex,tags,match-against,Php,Mysql,Regex,Tags,Match Against,我正在开发一个基于PHP的系统,用户可以使用MySQL数据库创建、发布和查看内容片段,每个内容片段都存储在一个表行中。当用户发布内容时,PHP脚本会提取常用词或标记(删除任何停止词,如“and”和“or”),按出现顺序排序,并将它们全部存储为数据库中的数组 除了查看每一条内容和生成的标签外,我还希望有一个功能可以显示一个类似内容的列表,这些内容包含一个或多个显示内容的标签(类似于YouTube的相关视频或新闻网站上的相关故事)。此外,我希望列表是根据每个内容有多少标签排序的 我做了一些研究,开发

我正在开发一个基于PHP的系统,用户可以使用MySQL数据库创建、发布和查看内容片段,每个内容片段都存储在一个表行中。当用户发布内容时,PHP脚本会提取常用词或标记(删除任何停止词,如“and”和“or”),按出现顺序排序,并将它们全部存储为数据库中的数组

除了查看每一条内容和生成的标签外,我还希望有一个功能可以显示一个类似内容的列表,这些内容包含一个或多个显示内容的标签(类似于YouTube的相关视频或新闻网站上的相关故事)。此外,我希望列表是根据每个内容有多少标签排序的

我做了一些研究,开发了两种不同的脚本,可以根据是否存在任何标记从数据库中选择行。然而,两个脚本都有问题

我第一次尝试的是一个类似的问题

$tags=$row['tags'];
$tags2=explode(",",$tags);
foreach ($tags2 as $key => $keyword) {
    $sql = ("SELECT DISTINCT * FROM table WHERE tags LIKE '%$keyword%' ");
    if ($key != (sizeof($tags2)-1)){ 
        $sql .= " OR "; 
    }
    $sql .= " LIMIT 20";
}
这个查询的问题是它没有对结果排序。然后我尝试了一个匹配的查询

$tags=$row['tags'];
$tags2=explode(",",$tags);
$searchstring="";
foreach ($tags2 as $word){
    $searchstring = $searchstring .' +'.$word;
}
$sql = ("SELECT * FROM table WHERE MATCH (tags) AGAINST ('$searchstring' IN BOOLEAN MODE)");
虽然结果是按相关性排序的,但它只检索所有标记都存在的行,如果该行甚至缺少一个标记,则查询不会检索该行

我想要的是结合这两个特性的优点,选择包含一个或多个标记的行,然后根据存在的标记数量对它们进行排序。例如如果第1行包含10个标记,第2行有20个标记,第1行中有9个标记,第3行有50个标记,第1行中有8个标记,则将检索第2行和第3行,第2行比第3行更相关


任何帮助都将不胜感激

$searchstring
中包含
+
字符是强制所有标记出现的原因。如果只输入单词并省略
+
,引擎将对其结果进行排序,而不要求每个单词都出现

请看下面的图片


每个单词都有很多选项<代码>+将强制在结果中的某个位置找到该词,
-
将强制在结果中的任何位置都找不到该词,
~
将允许找到某个词,但如果找到该词,则会降低结果的排名。阅读这些文档,它们非常有用。

这听起来像是“为我做我的工作”,而不是一个能让别人受益的问题。@Assaf:这可能是我对这个问题的措辞。我不想让任何人替我做这项工作。此外,我喜欢编码的挑战。关于如何解决这个问题的建议更接近于我想要的。@Assaf我不同意。他做研究。他提出了一些解决方案,并解释了为什么它们不起作用。他表示,只要指向正确的方向就足够了。所有这些对我来说都是合理的。几个月后我发现这是一个非常有用的问题和答案。如果只有人们愿意自己贡献,而不是批评别人的贡献。当你说省略+字符时,你的意思是将($searchstring=$searchstring.'+'.$word;)替换为($searchstring=$searchstring.$word;),只是我刚刚尝试过这个方法,我仍然遇到与以前相同的问题,显示的唯一结果是包含所有标记的行,而不是其中的一个或多个。谢谢你的帮助。这就是我的意思,是的,尽管你应该确保你仍然在每个单词之间添加空格。但通常,
MATCH(col)对('word1,word2,word3')
将返回包含word1,word2,word3中任何一个的行。如果您没有看到这种行为,您可以发布一个正在执行的查询的示例吗?忘记我最后的评论。我误解了你的答案。现在情况好多了。非常感谢。