如何在Laravel Scout+Meilisearch中添加不区分大小写的筛选?
解决Meilisearch + Laravel Scout不区分大小写的模糊筛选问题
要实现不区分大小写的模糊筛选,不能直接用Laravel Scout默认的where方法(它是精确匹配且区分大小写),得用Meilisearch原生的筛选语法结合Scout的filter方法来实现。
具体实现步骤
- 修改搜索方法,构建原生筛选表达式
直接利用Meilisearch的iContains操作符(不区分大小写的包含匹配),结合Scout的filter方法传入筛选规则:
public function search(Request $request) { // 初始化搜索查询 $searchQuery = Product::search($request->query('q', '')); // 处理前端传入的筛选条件 if ($filters = $request->input('filters')) { $filterRules = []; foreach ($filters as $filter) { $column = $filter['column']; $value = $filter['value']; // 用iContains实现不区分大小写的包含匹配 $filterRules[] = "{$column} iContains '{$value}'"; } // 合并所有筛选条件为AND关系(同时满足所有筛选) if (!empty($filterRules)) { $searchQuery->filter(implode(' AND ', $filterRules)); } } // 分页并加载关联模型 return tap($searchQuery->paginate(10), function ($results) { $results->load('category'); }); }
- 确保字段可筛选
要让code等字段能用于Meilisearch筛选,必须将其添加到索引的filterableAttributes中:
- 可以通过Artisan命令直接设置:
# 更新products索引的可筛选字段 php artisan scout:update-filterable-attributes products --attributes=code,name
版本兼容说明
如果你的Meilisearch版本低于v0.24,不支持iContains,可以用大小写转换的方式实现:
$filterRules[] = "lowercase({$column}) contains lowercase('{$value}')";
效果验证
当传入q=pana和filters[0][column]=code&filters[0][value]=23时,系统会返回id=1的Panadol产品,既匹配搜索词,又满足code包含"23"的不区分大小写筛选。
内容的提问来源于stack exchange,提问作者Tele oceans
相关产品推荐
相关产品推荐

