使用 Laravel 进行全文搜索的完整指南
构建 Laravel 10 全文搜索所需的一切。

在本指南中,我们将了解如何在 Laravel 10 中使用搜索功能。首先,我们将介绍全文搜索的优势。然后,我们将引导您在 Laravel 应用程序中设置全文搜索。
为什么使用全文搜索?
在传统的 SQL 或 NoSQL 数据库中,查询会精确匹配给定条件的结果。相反,全文搜索查询可以匹配数据库内容中的部分或全部文本查询。因此,本质上,全文搜索即使在部分匹配的情况下也能提供结果。
在构建面向用户的搜索界面时,全文搜索能增强用户体验。对拼写错误的容忍、前缀搜索和同义词有助于用户更快地获得结果。当用户不知道自己在寻找什么时,它还能提高可发现性。
查看 Meilisearch 搜索引擎的所有全文搜索功能。
如何在 Laravel 10 中使用搜索功能?
安装 Laravel Scout
Laravel 通过 Laravel Scout 提供开箱即用的全文搜索功能。
要启用它,请导航到您的 Laravel 应用程序目录,并通过 Composer 包管理器安装 Scout。
composer require laravel/scout
安装 Scout 后,您应该发布 Scout 配置文件。您可以通过运行以下 artisan 命令来完成此操作:
php artisan vendor:publish --provider="LaravelScoutScoutServiceProvider"
此命令将在您的应用程序目录中创建一个新的配置文件: config/scout.php
。
配置 Laravel Scout 驱动
让我们配置 Laravel Scout 使用 Meilisearch 驱动。Meilisearch 是一个用 Rust 构建的开源搜索引擎。这将允许获得最佳的全文搜索性能。事实上,数据库驱动本身就存在 [SQL 数据库固有的限制](/blog/postgres-full-text-search-limitations/#laravel&utm_source=blog&utm_medium=full-text-search-guide
首先,通过 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
。
这源于 Docker Bridge 网络驱动的行为。
对于生产用例,我们建议通过 Meilisearch Cloud 使用托管的 Meilisearch。在 Meilisearch Cloud 上,您可以在项目设置中找到您的主机 URL。
使 Eloquent 模型可搜索
安装并配置好 Scout 后,只需将 Laravel\Scout\Searchable
trait 添加到您的 Eloquent 模型中,即可使其可搜索。此 trait 将使用 Laravel 的模型观察器来使模型中的数据与 Meilisearch 保持同步。
这是一个模型示例:
<?php namespace AppModels; use IlluminateDatabaseEloquentModel; use LaravelScoutSearchable; class Contact extends Model { use Searchable; }
您可以使用 toSearchableArray
方法来配置哪些字段存储在 Meilisearch 中。这尤其允许将模型及其关联数据存储在同一文档中。
以下示例展示了如何在 Meilisearch 中存储模型的关联数据:
<?php namespace AppModels; use AppModelsCompany; use LaravelScoutSearchable; use IlluminateDatabaseEloquentModel; use IlluminateDatabaseEloquentRelationsBelongsTo; 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 允许您对搜索结果执行高级过滤和排序。通过 Meilisearch 索引设置选择哪些属性可过滤和可排序。
通过 config/scout.php
文件配置您的 Meilisearch 索引设置:
<?php use AppModelsContact; return [ // additional configuration... 'meilisearch' => [ 'host' => env('MEILISEARCH_HOST', 'http://localhost:7700'), 'key' => env('MEILISEARCH_KEY'), 'index-settings' => [ Contact::class => [ 'filterableAttributes' => ['organization_id'], 'sortableAttributes' => ['name', 'company_name'] ], ], ],
以上示例更新了 Contact 模型的 Meilisearch 索引设置:
- 它使
organization_id
字段可过滤 - 它使
name
和company_name
字段可排序
通过运行以下 Artisan 命令更新您的 Meilisearch 索引设置:
php artisan scout:sync-index-settings
Laravel 全文搜索示例
我们构建了一个演示应用程序,让您体验 Laravel 应用程序中的全文搜索。此演示展示了 CRM(客户关系管理)应用程序中的全应用范围搜索。
此演示应用程序使用以下搜索功能:
代码已在 GitHub 上开源。🎉
👉 查看仓库: https://github.com/meilisearch/saas-demo
我们希望本指南能帮助您理解全文搜索的重要性以及如何在 Laravel 中实现它。欲了解更多信息,请阅读 Laravel Scout 和 Meilisearch 文档。
Meilisearch 是一个开源搜索引擎,提供直观的开发者体验来构建面向用户的搜索功能。您可以自行托管它,或通过Meilisearch Cloud获得优质体验。
要了解更多关于 Meilisearch 的信息,您可以加入 Discord 社区或订阅 新闻通讯。您还可以通过查看 产品路线图 并参与 产品讨论来了解更多产品信息。