我的网站上有一个搜索表单,该表单可以在表中搜索匹配标题的文章标题。它似乎适用于某些字符串,但不适用于其他字符串,我不确定为什么。例如,如果您搜索"assassin's creed",则搜索功能将返回表中的右行。但是,如果您搜索"the last of us",即使其中包含该字符串的文章标题也没有结果。
以下是我的PHP / SQL命令。我有什么需要添加/更改的吗?每次运行查询时,是否需要在表的列上运行FULLTEXT索引?这是我第一次使用MySQL的MATCH AGAINST功能。通常,我会使用LIKE,但是在阅读了一些内容之后,显然MATCH AGAINST是一种更好的方法。
public function fetchSearchArticles($q, $category, $platform, $sort) {
$q = addslashes($q);
$category = ($category != 'all')? ' AND `cat_id` = '.$this->fetch_category_id($category).' ' : '';
$platform = ($platform != 'all')? ' AND `'.str_replace('-', '_', $platform).'` = 1 ': '';
$sort = ($sort != 'rel')? '`article_timestamp` '.strtoupper($sort).'' : "MATCH(`article_title`) AGAINST('$q')";
$query = $this->db->prepare ("
SELECT *
FROM articles
WHERE `article_is_published` = 1
$platform
$category
AND MATCH(`article_title`) AGAINST('+$q' IN BOOLEAN MODE)
ORDER BY $sort
LIMIT 20
");
try{
$query->execute();
$articles = $query->fetchAll(PDO::FETCH_ASSOC);
$query->closeCursor();
return $articles;
} catch(PDOException $e){
die($e->getMessage());
}
}
最佳答案
我相信其不适用于“我们中的最后一个人”的原因,因为它们在全文搜索的上下文中都被称为stop words。
您可以验证相同或替代的解决方案,我建议您从全文中禁用停用词。您只需要找到.cnf文件并将其添加,
ft_stopword_file = ""
重新启动mysql引擎并重建索引;
希望能奏效
关于php - MySQL MATCH AGAINST查询未返回某些请求,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25258525/