需要将有符号的标题替换一下,封装了一个函数如下:
--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;");上面第一种的布尔模式,适合在发布文章的时候,检测是否有重复文章。

