php,tp5关键词,分词模糊查询并根据查询条件排序
1.大概需求是我这边搜索"维修工",需要先搜索维修工再搜索维修,用一般模糊查询的话会导致维修的词出不来,所有这边需要先进行分词
public function getword($topictitle=''){//维修工
$length = mb_strlen($topictitle, 'utf-8');//计算文字长度
$titlearray = [];
$titlearrays = [];
for ($i=0; $i<$length; $i++)
{
$titlearray[] = mb_substr($topictitle, $i, 1, 'utf-8');//分字得到数组【‘维’,‘修’,‘工’】
}
$key='';
foreach ($titlearray as $k=>&$v){//二次循环得到词语【‘维’,‘维修’,‘维修工’】
$key.=$v;
$titlearrays[]=$key;
}
// dump($titlearrays);die;
return $titlearrays;
}
这里第二次循环是为了简便模糊查询使用,看个人需求可以不使用直接进行词性匹配按照匹配率进行排序,大概意思就是将三个字分开进行查询然后汇总查出三个数组中所有查询到的内容,再进行对出现次数进行筛选匹配排序等,详细写法在主页另一篇分词教学。
- 得到的词语我们进行构建查询条件
$name='维修工';
$words=$this->getword($name); //调用上面方法
$w['title']=array('or');
foreach ($words as $value) {
array_unshift( $w['title'], array('like', '%'.$value.'%'));
}
下面是得到的查询语句:
array(4) {
[0] => array(2) {
[0] => string(4) "like"
[1] => string(11) "%维修工%"
}
[1] => array(2) {
[0] => string(4) "like"
[1] => string(8) "%维修%"
}
[2] => array(2) {
[0] => string(4) "like"
[1] => string(5) "%维%"
}
[3] => string(2) "or"
}
3.使用以上方法可以将相关数据查询出来,但是如果不添加排序条件他会根据默认的id进行排序,但是这就会导致带“维”字的数据会排在带“维修工”的前面,所有我们需要用到一个函数LOCATE函数 ,该函数具体含义可自行搜索,下面只写用法
->field('*,LOCATE("'.$name.'",title) as gIndex ')->order('gIndex desc')//将搜索的值进行排序