我正在开发一个基于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中全文搜索的文档。
每个单词都有很多选项。+
将强制在结果中的某个地方找到该单词,-
将强制在该结果中的任何地方都找不到该单词,而~
将允许找到一个单词,但如果找到了该单词,则降低该结果的排名。阅读文档,它们非常有用。