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



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

除了查看每一条内容和生成的标签外,我还想要一个功能,显示发布的类似内容的列表,这些内容具有所显示内容的一个或多个标签(类似于YouTube的相关视频或新闻网站上的相关故事)。此外,我希望根据每条内容的标签数量对列表进行排序。

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

我第一次尝试的是LIKE查询;

$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";
}

此查询的问题在于它没有对结果进行排序。然后我尝试了一个MATCH NOT查询;

$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)");

虽然结果是按相关性排序的,但它只检索其中存在所有标记的行,如果该行甚至缺少一个标记,则查询不会检索该行。

我想要的是将这两种功能的优点结合起来,选择包含一个或多个标签的行,然后根据存在的标签数量对它们进行排序。例如如果row1包含10个标签,row2有20个标签,其中9个在row1中找到,row3有50个标签,8个在row3中找到,那么row2和row3都将被检索,其中row2比row3更相关。

如有任何帮助,将不胜感激

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

看看MySQL中全文搜索的文档。

每个单词都有很多选项。+将强制在结果中的某个地方找到该单词,-将强制在该结果中的任何地方都找不到该单词,而~将允许找到一个单词,但如果找到了该单词,则降低该结果的排名。阅读文档,它们非常有用。

相关内容

  • 没有找到相关文章

最新更新