【随手记】PHP分词后,使用SQL字段权重排序查询

应用场景

应用场景为已使用SWCS分词及SPHINX搜索引擎后,仍需要使用SQL进行单独独立字段分词。

实现效果为:记录分词后每个关键词再数据表中各字段出现的次数,并根据不同字段累加实际使用的权值。通过权值进行搜索排序。

废话不多~直接上干货!

关键代码

//如果有分词的情况下进入
if($keywords_tags){
	//增加筛选条件
   $pre_next_page_sql = "*,( ";
   //开始遍历循环判断SQL中出现的分词次数
   foreach ($keywords_tags as $tags_key => $tags_value) {
       $tags_value = str_replace('"',"",$tags_value);
       //字段A代表着数据表中的字段,后面累加的10或1为要累加的权值 可动态修改
       $pre_next_page_sql .= "IF(LOCATE('".$tags_value."',字段A) , 10, 0) + 
                      IF(LOCATE('".$tags_value."',字段B) , 1, 0) + 
                      IF(LOCATE('".$tags_value."',字段C) , 1, 0) + 
                      /*此处省略N个字段*/
                      IF(LOCATE('".$tags_value."',字段N) , 1, 0) +";
   }
   //将权值重命名为tags_weight字段
   $pre_next_page_sql .= " 1) AS tags_weight";
}

//在排序的规则处增加OrderBy
$order_by = " ORDER BY tags_weight DESC";

//最后,根据使用框架拼接SQL即可

问题思路

其中的关键重点在于使用了SQL中的 LOCATE 函数,该函数的解析为:

	LOCATE(substr,str),   LOCATE(substr,str,pos)

第一个语法返回字符串str第一次出现的子串substr的位置。

第二个语法返回第一次出现在字符串str的子串substr的位置,从位置pos开始。 substr不在str中,则返回0。

配合使用SQL中的IF判断,如果分词后的字符串出现在了字段条件中,即说明字段包含改分词,则累加对应的 权值 最后根据 tags_weight 字段倒序排序查询,即可实现该功能。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值