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

Laravel阿拉伯语搜索问题:如何匹配结尾为ه与ة的异构单词?

嘿,这个问题太常见了!阿拉伯语里的تاء مربوطة(ة)和هاء(ه)经常在模糊搜索时搞出这种小麻烦——明明是同一个词的不同写法,常规LIKE却认不出来。我在项目里处理过好几次,给你几个Laravel里能用的解决方案:

方法1:修改数据库字段的排序规则(最推荐)

其实很多数据库排序规则会把阿拉伯语里的ه和ة视为等价字符,比如utf8mb4_arabic_ci或者utf8mb4_unicode_ci(部分版本支持)。只要把存储阿拉伯语内容的字段设置成这个排序规则,常规的LIKE查询就能自动匹配这两个形似词了。

步骤:

  1. 如果是新建表,在迁移文件里指定排序规则:
Schema::create('buildings', function (Blueprint $table) {
    $table->id();
    // 给存储阿拉伯语的字段指定排序规则
    $table->string('name')->collate('utf8mb4_arabic_ci');
    $table->timestamps();
});
  1. 如果是已有表,修改字段的排序规则:
Schema::table('buildings', function (Blueprint $table) {
    $table->string('name')->collate('utf8mb4_arabic_ci')->change();
});
  1. 之后用普通的whereLike或者LIKE查询就能生效:
$searchTerm = 'عماره';
// 会同时匹配到「عماره」和「عمارة」
$results = Building::where('name', 'LIKE', "%{$searchTerm}%")->get();

这个方法最省心,数据库层面自动处理,不用在业务代码里做额外的字符替换。

方法2:搜索前统一归一化字符

如果没法修改数据库排序规则(比如权限限制),可以在搜索前把搜索词和数据库里的字符做统一替换,把ه和ة转换成同一个字符,再进行查询。

方案A:双方向替换查询

$searchTerm = request('search');

$results = Building::where(function ($query) use ($searchTerm) {
    // 把搜索词里的ه换成ة,查询一次
    $query->where('name', 'LIKE', "%".str_replace('ه', 'ة', $searchTerm)."%")
          // 把搜索词里的ة换成ه,再查询一次
          ->orWhere('name', 'LIKE', "%".str_replace('ة', 'ه', $searchTerm)."%")
          // 保留原词查询,避免漏匹配
          ->orWhere('name', 'LIKE', "%{$searchTerm}%");
})->get();

方案B:用正则表达式匹配

MySQL支持正则表达式查询,我们可以把搜索词里的ه或ة替换成[هة],这样就能匹配任意一个字符:

$searchTerm = request('search');
// 把ه和ة替换成匹配二者的正则表达式
$pattern = str_replace(['ه', 'ة'], '[هة]', $searchTerm);

$results = Building::whereRaw('name REGEXP ?', [$pattern])->get();

这个方案的好处是不用改数据库,但需要维护字符替换的逻辑,如果后续有其他形似字符需要处理,得更新替换规则。

方法3:使用全文搜索功能

如果你的项目需要更复杂的多语言搜索支持,可以用Laravel的全文搜索功能,比如MySQL原生的全文索引或者Laravel Scout。

MySQL原生全文索引示例:

  1. 先给字段添加全文索引(指定阿拉伯语语言):
Schema::table('buildings', function (Blueprint $table) {
    $table->fullText('name')->language('arabic');
});
  1. 使用全文搜索查询:
$searchTerm = 'عماره';
$results = Building::whereRaw('MATCH(name) AGAINST(? IN BOOLEAN MODE)', [$searchTerm])->get();

全文搜索不仅能处理ه和ة的问题,还能支持更智能的分词和匹配,适合搜索需求复杂的项目。


内容的提问来源于stack exchange,提问作者Farouz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:43:06