记录:商品查询接口对搜索关键词进行拆分搜索
拆分方式:
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}%");
});
}
};
}