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