2

关键字匹配度搜索排序

Posted in 有意义的代码 at 3月 16th, 2009 /

一直被这个问题困扰,这周终于实现了,或许这些代码不是标准的,不是最有效率的,但希望能抛砖引玉。

曾今我也用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<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++;
}
}

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

最后生成的SQL大家自己看看就知道了,算是个抛砖引玉吧,大家有更好的代码,请不要吝啬告诉我。

Published in 有意义的代码

随机文章
  • 美景→仙境 2008年7月12日
  • 暧昧有多近,爱情有多远 2009年6月23日
  • 像泡妞一样做展览会 - 成功展会十大原则 2010年2月7日
  • 从“魔”“兽”争霸看中国互联网 2009年11月5日
  • 征婚方程式 2009年6月23日
  • 87.53% 2009年12月11日
  • 一夜情 2008年10月2日
  • 刘翔版狮王争霸 2008年7月29日
  • 爷爷 2008年5月31日
  • 谈谈绿坝,谈谈网络 2009年6月12日
  • 2 条留言 to “关键字匹配度搜索排序

    1. 12月 21st, 2009 at 2:42 下午 #Jack

      非常好,谢谢分享

    2. 2月 6th, 2010 at 3:18 下午 #青怪

      谢谢,今天也遇到这个问题。

    留言

    有意义的声明

    我的Blog我做主,我的Blog不客观
    如果您要求客观,建议您去CCTV
    如果您要求官方,建议您去人民网
    我用我的键盘敲出我想法,
    所以请你用自己的脑袋和眼睛来阅读,
    如有误导,概不负责。

    最近的日志

    订阅有意义的内容