在数据库 mysql php 中搜索多个关键字


Searching multiple keywords in database mysql php

我的搜索函数在每个空格后分解多个关键字中的字符串。然后,它会运行一个查询,在该查询中,它将在标签列中搜索这些关键字。

但是,因为我在 LIKE 之间使用 AND,所以它只返回每个关键字都在标签列中的结果。如果我使用 OR,它将显示每个结果,标签列中带有一个或多个关键字。

如果结果只有关键字:切洋葱,我怎样才能得到这样的句子:"如何切洋葱?"来找到结果。

我的代码:

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

您可以使用全文搜索,但您应该记住性能问题,因为数据库越大,它就越慢。

MATCH 将排除 3 个字符(我认为)或更少的搜索词。这可以在服务器根目录的主 SQL 文件 (my.cnf) 中进行调整。(更多关于这里)

另外,请记住正确转义搜索词。此示例不会这样做。

例:

$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

试试这个 SQL 并让你的 PHP 脚本输出它:

SELECT * FROM results WHERE tags LIKE ('%cutting%') AND tags LIKE ('%onion%')