在本指南中,您将了解如何设置 Laravel Scout 以便在 Laravel 10 应用中使用 Meilisearch。

先决条件

开始之前,请确保您的机器已安装以下组件:

您还需要一个 Laravel 应用程序。如果没有,可以通过运行以下命令创建新应用:

composer create-project laravel/laravel my-application

安装 Laravel Scout

Laravel 通过 Laravel Scout 提供了开箱即用的全文搜索功能。

要启用该功能,请导航至您的 Laravel 应用目录,通过 Composer 包管理器安装 Scout:

composer require laravel/scout

安装 Scout 后,您需要发布 Scout 配置文件。可以通过运行以下 artisan 命令完成:

php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"

此命令将在您的应用目录中创建新的配置文件:config/scout.php

配置 Laravel Scout 驱动

现在您需要配置 Laravel Scout 使用 Meilisearch 驱动。首先通过 Composer 安装 Scout 与 Meilisearch 配合所需的依赖项:

composer require meilisearch/meilisearch-php http-interop/http-factory-guzzle

然后更新 .env 文件中的环境变量:

SCOUT_DRIVER=meilisearch

# 如果通过 Laravel Sail 运行 Meilisearch,请使用以下主机地址
MEILISEARCH_HOST=http://meilisearch:7700
MEILISEARCH_KEY=masterKey

本地开发

Laravel 官方的 Docker 开发环境 Laravel Sail 已内置集成了 Meilisearch 服务。请注意,通过 Sail 运行 Meilisearch 时,Meilisearch 的主机地址是 http://meilisearch:7700(而不是常见的 http://localhost:7700)。

详情请参阅 Docker 的 Bridge 网络驱动文档。

生产环境部署

对于生产环境,我们推荐使用托管版的 Meilisearch Cloud。在 Meilisearch Cloud 中,您可以在项目设置中找到主机 URL。

如果您选择自托管方案,请参阅我们的 生产环境部署指南

使 Eloquent 模型可搜索

安装并配置好 Scout 后,在 Eloquent 模型中添加 Laravel\Scout\Searchable trait 即可使其可被搜索。该 trait 会利用 Laravel 的模型观察器来保持模型数据与 Meilisearch 同步。

以下是一个示例模型:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Laravel\Scout\Searchable;

class Contact extends Model
{
 use Searchable;
}

要配置哪些字段存储在 Meilisearch 中,可使用 toSearchableArray 方法。通过此技术可以将模型及其关联关系数据存储在同一文档中。

下面的示例展示了如何在 Meilisearch 中存储模型的关联数据:

<?php

namespace App\Models;

use App\Models\Company;
use Laravel\Scout\Searchable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

class Contact extends Model
{
    use Searchable;

    public function company(): BelongsTo
    {
        return $this->belongsTo(Company::class);
    }

    public function toSearchableArray(): array
    {
       // 所有模型属性都设为可搜索
        $array = $this->toArray();

      // 然后添加一些额外字段
        $array['organization_id'] = $this->company->organization->id;
        $array['company_name'] = $this->company->name;
        $array['company_url'] = $this->company->url;

        return $array;
    }
}

配置可筛选和可排序属性

通过 Meilisearch 索引设置来配置哪些属性可以筛选排序

在 Laravel 中,你可以通过 config/scout.php 文件配置索引设置:

<?php

use App\Models\Contact;

return [
   // 其他 Scout 配置...

    'meilisearch' => [
        'host' => env('MEILISEARCH_HOST', 'https://edge.meilisearch.com'),
        'key' => env('MEILISEARCH_KEY'),
        'index-settings' => [
            Contact::class => [
                'filterableAttributes' => ['organization_id'],
                'sortableAttributes' => ['name', 'company_name']
            ],
        ],
    ],
];

上面的示例更新了 Contact 模型的 Meilisearch 索引设置:

  • 使 organization_id 字段可筛选
  • 使 namecompany_name 字段可排序

更改索引设置后,你需要同步 Scout 的索引设置。

同步索引设置

要同步索引设置,请运行以下命令:

php artisan scout:sync-index-settings

示例用法

您构建了一个示例应用程序来演示如何将 Meilisearch 与 Laravel Scout 结合使用。该示例展示了一个 CRM(客户关系管理)应用中的全局搜索功能。

这个演示应用使用了以下功能:

当然,代码已在 Github 上开源。🎉