在本指南中,您将了解如何设置 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
# Use the host below if you're running Meilisearch via Laravel Sail
MEILISEARCH_HOST=http://meilisearch:7700
MEILISEARCH_KEY=masterKey

本地开发

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

查看 Docker 桥接网络驱动程序 文档以获取更多详细信息。

在生产环境中运行

对于生产用例,我们建议通过 Meilisearch Cloud 使用托管的 Meilisearch。在 Meilisearch Cloud 上,您可以在项目设置中找到您的主机 URL。

如果您更喜欢自托管,请阅读我们的 在生产环境中运行 Meilisearch 指南。

使 Eloquent 模型可搜索

安装并配置 Scout 后,将 Laravel\Scout\Searchable trait 添加到您的 Eloquent 模型中,以使其可搜索。此 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
    {
       // All model attributes are made searchable
        $array = $this->toArray();

      // Then we add some additional fields
        $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 [
   // Other Scout configuration...

    '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 上开源。🎉