MySQL ngram 全文检索中文有符号布尔模式BOOLEAN搜索不到内容的解决方法

2024-02-20 10:52:47 举报文章

需要将有符号的标题替换一下,封装了一个函数如下:

--by www.qzphp.cn
function ngram_keywords($keywords){
    //$前要加反斜杠
    $specialChars = "~~·`!!@#\$¥%^…&*()()—-=+[]{}【】、|\\;:;:'\"“”‘’,./<>《》??,。°";
    $specialArr = array();
    $len = mb_strlen($specialChars, 'UTF-8');
    for ($i = 0; $i < $len; $i++) {
        $specialArr[] = mb_substr($specialChars, $i, 1, 'UTF-8');
    }
    $newskeywords = str_replace($specialArr, "+", $keywords);
    $newskeywordsdb = explode("+", $newskeywords);
    foreach($newskeywordsdb AS $val){
        $val = preg_replace("/^\d+/", "", $val);
        $val && $keywordsdb[] = '+\"' . $val . '\"';
    }
    return implode(" ", $keywordsdb);
}
--by www.qzphp.cn
$newkeywords = ngram_keywords($keywords);
$query = $db->query("SELECT * FROM `{$_pre}content` WHERE 1 AND MATCH(`title`) AGAINST ('{$newkeywords}' IN BOOLEAN MODE) ORDER BY LENGTH(title) ASC;");

以上即可搜索到内容,或者直接使用自然语言模式,但是经测试,大数据量,搜索效率比布尔模式差太多。

自然语言模式不要替换,直接使用,如下:

--by www.qzphp.cn
$query = $db->query("SELECT * FROM `{$_pre}content` WHERE 1 AND MATCH(`title`) AGAINST ('{$keywords}') LIMIT 10;");

上面第一种的布尔模式,适合在发布文章的时候,检测是否有重复文章。

如果你认为本文可读性较差,内容错误,或者文章排版错乱,请点击举报文章按钮,我们会立即处理!