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

基于Laravel Scout实现容错搜索:处理拼写错误与冗余元音

Laravel Scout 实现容错式用户全名搜索方案

问题1:处理拼写错误(如'Dena'匹配'Dean')

根据你使用的Scout驱动,有两种实用方案:

第三方搜索服务(Algolia/Meilisearch)

这类服务自带拼写纠错能力,只需在搜索时开启对应配置:

  • Algolia:添加拼写容错参数
    $searchProfileQuery = Profile::search($request->input('query'))
        ->with(['typoTolerance' => true])
        ->get();
    
  • Meilisearch:默认开启拼写纠错,如需自定义规则,可在搜索时设置typo_tolerance参数

数据库驱动(如MySQL)

利用MySQL的编辑距离或语音匹配函数,筛选相似度高的结果:

  • 编辑距离方案(匹配拼写误差≤2的结果):
    $keyword = $request->input('query');
    $searchProfileQuery = Profile::whereRaw("LEVENSHTEIN(full_name, ?) <= 2", [$keyword])->get();
    

    注:若MySQL未启用LEVENSHTEIN,需先安装udf_mysql扩展

  • 语音匹配方案(适合英文发音相近的拼写错误):
    $searchProfileQuery = Profile::whereRaw("SOUNDEX(full_name) = SOUNDEX(?)", [$request->input('query')])->get();
    

问题2:处理冗余元音(如'Been'匹配'Ben')

核心是对搜索关键词和索引字段做重复字符归一化处理:

步骤1:模型中添加字段归一化逻辑

在Profile模型里处理全名,去除连续重复的字符:

// 定义归一化全名的访问器
public function getNormalizedFullNameAttribute()
{
    return preg_replace('/(.)\1+/', '$1', strtolower($this->full_name));
}

// 重写Scout索引数组,加入归一化字段
public function toSearchableArray()
{
    $array = $this->toArray();
    $array['normalized_full_name'] = $this->normalized_full_name;
    return $array;
}

步骤2:修改搜索逻辑

搜索时先对关键词做同样的归一化,再匹配处理后的字段:

$keyword = preg_replace('/(.)\1+/', '$1', strtolower($request->input('query')));
$searchProfileQuery = Profile::search($keyword)
    ->where('normalized_full_name', 'like', "%{$keyword}%")
    ->get();

内容的提问来源于stack exchange,提问作者T R A C E ツ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 01:20:32