基于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 ツ
相关产品推荐
相关产品推荐

