如何在Laravel Scout中实现多词任意顺序的精准搜索?
解决Laravel Scout Database驱动多词AND匹配问题
快速临时实现方案
直接在控制器中处理关键词,手动构建多条件查询:
// 拆分并过滤搜索关键词(去除空字符串,避免多空格导致无效查询) $keywords = array_filter(explode(' ', $request->filter)); // 执行搜索:传入空字符串跳过默认单LIKE条件,通过query闭包添加多关键词AND匹配 $posts = Post::search('') ->query(function ($query) use ($keywords) { foreach ($keywords as $keyword) { // 单字段匹配示例 // $query->where('content', 'LIKE', "%{$keyword}%"); // 多字段匹配示例(标题或内容包含当前关键词) $query->where(function ($q) use ($keyword) { $q->where('title', 'LIKE', "%{$keyword}%") ->orWhere('content', 'LIKE', "%{$keyword}%"); }); } }) ->get();
永久全局方案(自定义Scout引擎)
如果需要全局统一使用多词AND匹配逻辑,可自定义Database引擎:
- 创建自定义引擎类
App\Engines\CustomDatabaseEngine
<?php namespace App\Engines; use Laravel\Scout\Engines\DatabaseEngine; use Laravel\Scout\Builder; class CustomDatabaseEngine extends DatabaseEngine { public function search(Builder $builder) { $query = $this->model->newQuery(); $keywords = array_filter(explode(' ', $builder->query)); // 无关键词时返回空结果 if (empty($keywords)) { return $query->whereRaw('1 = 0'); } // 每个关键词在所有搜索字段中OR匹配,多关键词之间AND连接 foreach ($keywords as $keyword) { $query->where(function ($q) use ($builder, $keyword) { foreach ($builder->model->searchableColumns() as $column) { $q->orWhere($column, 'LIKE', "%{$keyword}%"); } }); } return $query; } }
- 在模型中指定使用自定义引擎
use Laravel\Scout\Searchable; use App\Engines\CustomDatabaseEngine; class Post extends Model { use Searchable; // 指定自定义引擎 public function searchableUsing() { return new CustomDatabaseEngine(app('db')); } // 定义需要搜索的字段(可选,默认使用模型可填充字段) public function searchableColumns() { return ['title', 'content']; } }
- 控制器中使用原有代码即可
$posts = Post::search($request->filter)->get();
以上两种方案都能实现「无论词汇顺序,只要包含所有搜索词即匹配」的效果,等价于执行 column LIKE %Hello% AND column LIKE %Post% 这类多条件查询。
内容的提问来源于stack exchange,提问作者sevakian
相关产品推荐
相关产品推荐

