tp5 关键词搜索商品时进行关键词拆分
记录:商品查询接口对搜索关键词进行拆分搜索
拆分方式:
1,正则匹配
// 1. 清理并拆分关键词(支持中文+空格拆分)$keywords = array_filter(preg_split('/[\s]+/u', trim($keyword)),function($item) {return $item !== '';});
2,使用中文分词库Jieba-php拆分
// 安装Jieba分词库:composer require fukuball/jieba-php
use Fukuball\Jieba\Jieba;
use Fukuball\Jieba\Finalseg;// 初始化分词器
// Jieba::init(); //初始化大词典,对内存高消耗,不建议使用
Jieba::init(['mode' => 'default', 'dict' => 'small']); //初始化小词典,对内存低消耗,推荐使用
Finalseg::init();// 执行分词
$keywords = Jieba::cut($keywords);
$keywords = array_unique(array_filter($keywords)); // 数组去重、过滤数组中的空字符串
最后,使用闭包函数对每个关键词搜索
$keywordsWhere = '';
if($keywords){// 1.分词操作代码// 2.组合闭包查询$keywordsWhere = function ($query) use ($keywords) {foreach($keywords as $keyword){// // 每个关键词在多个字段中匹配(AND),即商品信息中包含所有的关键词// $query->where(function ($sub) use ($keyword) {// $sub->where('goods_name', 'like', "%{$keyword}%")// ->whereOr('content', 'like', "%{$keyword}%");// });// 每个关键词在多个字段中匹配(OR),即商品信息中包含任意一个关键词$query->whereOr(function ($sub) use ($keyword) {$sub->where('m.goods_name', 'like', "%{$keyword}%")->whereOr('m.content', 'like', "%{$keyword}%");});}};
}