欢迎访问 水平网, 今天是:2010年09月09日 [订阅本站] [用户注册/登录] [收藏本站]
首     页 技术文章 注 册 码 代码仓库 资源下载 技术讨论 实用工具 站内搜索 联系我们
■ 站内搜索
■ 专题分类
■ 推荐文章
■ 热点文章
■ 相关文章
■ 当前位置:首页 >> 技术文章 >> 数据库 >> MySQL >> 文章内容

MYSQL 关键字 相关性排序 匹配度排序

曾今我也用LIKE ‘%kw%’ 来查找满足条件的数据,但是如果遇到多关键字,在排序上就出现了问题,而大家当然愿意把最匹配的搜索结果排在前列,而不是按其他标准排序。
打个比方,如果搜索关键字“IBM”,“服务器”,
首先,对搜索关键字的处理,代码如下:[水平网:http://goalercn.com]

$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);//枚举关键字
这里还需要添加一个去掉标点符号的代码,但是这段代码会出现问题,不知道如何解决。[水平网:http://goalercn.com]

然后是生成SQL语句的代码
$f = array(”name”,”description”); //查询的字段name=产品名,description=产品描述
$s = array(4,2); //权重,name字段匹配积分4分,description字段匹配积2分,最后按积分排序[水平网:http://goalercn.com]

//创建查询条件语句
for($i=0;$i<count($q);$i++){
for($j=0;$j<count($f);$j++){
$clause[$c] = ” (”.$f[$j].” LIKE ‘%”.$q[$i].”%’) “;
$score[$c] = ” IF(LOCATE(’”.$q[$i].”‘, “.$f[$j].”), “.$s[$j].”, 0) “;
$c++;
}
}
[水平网:http://goalercn.com]

$sql = “SELECT id, name, description,
(”.implode(”+”,$score).”) AS score
FROM product
WHERE (”.implode(” OR “,$clause).”)
ORDER BY score DESC”;
[水平网:http://goalercn.com]

最后生成的SQL大家自己看看就知道了,算是个抛砖引玉吧,大家有更好的代码,请不要吝啬告诉我。
■ 发表评论
您的称呼:
联系方式:
验 证 码 : 看不清楚?点击刷新验证码 看不清楚?点击图片刷新验证码
■ 最新评论显示所有评论