应用场景
应用场景为已使用SWCS分词及SPHINX搜索引擎后,仍需要使用SQL进行单独独立字段分词。
实现效果为:记录分词后每个关键词再数据表中各字段出现的次数,并根据不同字段累加实际使用的权值。通过权值进行搜索排序。
废话不多~直接上干货!
关键代码
if($keywords_tags){
$pre_next_page_sql = "*,( ";
foreach ($keywords_tags as $tags_key => $tags_value) {
$tags_value = str_replace('"',"",$tags_value);
$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) +";
}
$pre_next_page_sql .= " 1) AS tags_weight";
}
$order_by = " ORDER BY tags_weight DESC";
问题思路
其中的关键重点在于使用了SQL中的 LOCATE 函数,该函数的解析为:
LOCATE(substr,str), LOCATE(substr,str,pos)
第一个语法返回字符串str第一次出现的子串substr的位置。
第二个语法返回第一次出现在字符串str的子串substr的位置,从位置pos开始。 substr不在str中,则返回0。
配合使用SQL中的IF判断,如果分词后的字符串出现在了字段条件中,即说明字段包含改分词,则累加对应的 权值 最后根据 tags_weight 字段倒序排序查询,即可实现该功能。
|