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

如何在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引擎:

  1. 创建自定义引擎类 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;
    }
}
  1. 在模型中指定使用自定义引擎
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'];
    }
}
  1. 控制器中使用原有代码即可
$posts = Post::search($request->filter)->get();

以上两种方案都能实现「无论词汇顺序,只要包含所有搜索词即匹配」的效果,等价于执行 column LIKE %Hello% AND column LIKE %Post% 这类多条件查询。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 23:42:36