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

如何使用Laravel Scout Algolia实现字符串模糊搜索过滤?

在Laravel Scout + Algolia中实现类似LIKE的字符串过滤

你的代码报错是因为Laravel Scout针对Algolia的where方法仅支持精确匹配类操作符(=、!=、IN等),不支持SQL风格的LIKE模糊匹配。以下是几种可行的替代方案:

方案1:使用Algolia原生过滤语法(推荐)

Algolia支持通配符实现前缀、后缀或包含匹配,你可以通过whereRaw方法直接传入Algolia的过滤规则:

public function search(Request $request)
{
    // 先解析JSON格式的filter参数
    $filter = json_decode($request->filter);
    if (!$filter?->name) {
        return Product::search($request->q)->paginate(10);
    }

    $results = Product::search($request->q)
        // 使用*通配符实现包含匹配,等同于SQL的LIKE '%pan%'
        ->whereRaw('name:*' . $filter->name . '*')
        ->paginate(10);

    return $results;
}

注意事项:

  • 要让通配符匹配生效,需在Algolia后台的索引设置中,将name字段添加到attributesToIndex,并确保字段配置支持部分匹配(可设置为unordered(name)来忽略分词顺序)。
  • 全局通配符*xxx*的性能略低于前缀/后缀匹配(如xxx*或*xxx),如果业务场景允许优先匹配前缀/后缀,建议调整通配符位置以优化性能。

方案2:将过滤条件合并到搜索关键词

如果不需要严格限定仅在name字段过滤,可以把过滤字符串合并到搜索关键词中,利用Algolia的全文搜索能力实现模糊匹配:

public function search(Request $request)
{
    $filter = json_decode($request->filter);
    $searchQuery = $request->q;
    
    if ($filter?->name) {
        // 将过滤字符串追加到搜索关键词
        $searchQuery .= ' ' . $filter->name;
    }

    $results = Product::search($searchQuery)->paginate(10);
    return $results;
}

方案3:优化Algolia索引配置

如果需要更精准的模糊匹配效果,可在Algolia后台对索引进行以下配置:

  • 在Attributes to index中,为name字段启用部分匹配(勾选"Allow partial matching")。
  • 调整Typo tolerance相关参数,降低最小词长阈值,让短字符串也能触发模糊匹配。

内容的提问来源于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:31:06