You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Laravel Scout+Meilisearch中添加不区分大小写的筛选?

解决Meilisearch + Laravel Scout不区分大小写的模糊筛选问题

要实现不区分大小写的模糊筛选,不能直接用Laravel Scout默认的where方法(它是精确匹配且区分大小写),得用Meilisearch原生的筛选语法结合Scout的filter方法来实现。

具体实现步骤

  1. 修改搜索方法,构建原生筛选表达式
    直接利用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');
    });
}
  1. 确保字段可筛选
    要让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 21:11:29