1. 程式人生 > >MYSQL 關鍵字 相關性排序 匹配度排序

MYSQL 關鍵字 相關性排序 匹配度排序

曾今我也用LIKE ‘%kw%’ 來查詢滿足條件的資料,但是如果遇到多關鍵字,在排序上就出現了問題,而大家當然願意把最匹配的搜尋結果排在前列,而不是按其他標準排序。
打個比方,如果搜尋關鍵字"IBM","伺服器",
首先,對搜尋關鍵字的處理,程式碼如下:

$kw = preg_replace("/(\s+)|( +)+/", " ", $kw);//替代空格,換行,tab,中文空格
$kw = preg_replace( "/(^\s*)|(\s*$)/ ", "",$kw);//去除首尾空格
$kw = preg_replace("/(\s+)/", " ", $kw);//替換多個空格為一個空格
//$kw = preg_replace( "/[[:punct:]]/", " ", $kw);//去除所有標點符號,此程式碼有問
$q = explode(" ",$kw);//列舉關鍵字

這裡還需要新增一個去掉標點符號的程式碼,但是這段程式碼會出現問題,不知道如何解決。

然後是生成SQL語句的程式碼

$f = array("name","description"); //查詢的欄位name=產品名,description=產品描述
$s = array(4,2); //權重,name欄位匹配積分4分,description欄位匹配積2分,最後按積分排序

//建立查詢條件語句
for($i=0;$i
for($j=0;$j
$clause[$c] = " (".$f[$j]." LIKE ‘%".$q[$i]."%’) ";
$score[$c] = " IF(LOCATE(’".$q[$i]."‘, ".$f[$j]."), ".$s[$j].", 0) ";
$c++;
}
}

$sql = "SELECT id, name, description,(".implode("+",$score).") AS score FROM product WHERE (".implode(" OR ",$clause).") ORDER BY score DESC";