我的搜索功能会在每个空格后触发多个关键字中的字符串。然后它运行一个查询,它将在tags列中搜索这些关键字。
但是,因为我在LIKES之间使用AND,所以它只返回每个关键字都在tags列中的结果。如果我使用OR,它将显示每个结果,其中包含一个或多个位于标签列中的关键字。
我怎样才能得到一句话:"如何切洋葱?"如果结果只有关键字,那就找到结果:cutting,onion。
我的代码:
$searchTerms = explode(' ', htmlspecialchars($_GET['tags'], ENT_QUOTES));
$searchTermBits = array();
foreach ($searchTerms as $term) {
$term = trim($term);
if (!empty($term)) {
$searchTermBits[] = "tags LIKE '%$term%'";
}
}
$sql = "SELECT * FROM results WHERE ".implode(' AND ', $searchTermBits)." ORDER BY id DESC";
答案 0 :(得分:0)
您可以使用全文搜索,但是您应该记住性能问题,因为数据库变得越大越慢。
MATCH将排除3个字符(我认为)和更少的搜索字词。这可以在服务器根目录中的主SQL文件(my.cnf)中进行调整。 (更多关于here)
还要记住要正确转义搜索字词。这个例子没有那样做。
示例:
$sql = "CREATE TEMPORARY TABLE `tmp_search`
(FULLTEXT INDEX (tags))
Engine=MyISAM
SELECT * FROM `results`";
// execute sql;
$sql = "SELECT *,
MATCH(tags) AGAINST ('".$term."' IN BOOLEAN MODE) as `tags_relevance`
FROM `tmp_search`
WHERE MATCH(tags) AGAINST ('".$term."' IN BOOLEAN MODE)
ORDER BY tags_relevance DESC";
// get results from sql
答案 1 :(得分:-1)
尝试使用此SQL并将PHP脚本输出:
SELECT * FROM results WHERE tags LIKE ('%cutting%') AND tags LIKE ('%onion%')