Meilisearch v1.14 发布啦 ✨ 在我们的博客上阅读更多信息

回到首页Meilisearch 的 Logo
返回文章
2023 年 11 月 27 日

Laravel 全文搜索完整指南

构建 Laravel 10 全文搜索所需的一切。

Laurent Cazanove
Laurent Cazanove开发者体验工程师StriftCodes
A complete guide to full-text search with Laravel

在本指南中,我们将了解如何在 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 桥接网络驱动程序 行为。

对于生产用例,我们建议通过 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 字段可过滤
  • 它使 namecompany_name 字段可排序

通过运行以下 Artisan 命令更新您的 Meilisearch 索引设置

php artisan scout:sync-index-settings

Laravel 全文搜索示例

我们构建了一个演示应用程序,让您感受一下 Laravel 应用程序中的全文搜索是什么样的。此演示展示了 CRM(客户关系管理)应用程序中的应用范围搜索。

CRM demo application build with Laravel

Laravel SaaS 搜索演示

此演示应用程序使用以下搜索功能

代码已在 Github 上开源。 🎉

👉 查看仓库: https://github.com/meilisearch/saas-demo


我们希望本指南有助于您理解全文搜索的重要性以及如何在 Laravel 中实现它。有关更多信息,请阅读 Laravel ScoutMeilisearch 文档。

Meilisearch 是一款开源搜索引擎,具有直观的开发者体验,可用于构建面向用户的搜索。您可以自行托管它,或者通过 Meilisearch Cloud 获得优质体验。

要了解更多关于 Meilisearch 的信息,您可以加入 Discord 上的社区Discord,或订阅新闻通讯。您可以通过查看路线图和参与产品讨论来了解有关该产品的更多信息。

Meilisearch indexes embeddings 7x faster with binary quantization

Meilisearch 通过二进制量化将嵌入向量索引速度提高 7 倍

通过使用向量存储 Arroy 实现二进制量化,大型嵌入向量的磁盘空间使用量和索引时间显着减少,同时保持了搜索相关性和效率。

Tamo
Tamo2024 年 11 月 29 日
How to add AI-powered search to a React app

如何将 AI 驱动的搜索添加到 React 应用程序

使用 Meilisearch 的 AI 驱动搜索构建 React 电影搜索和推荐应用程序。

Carolina Ferreira
Carolina Ferreira2024 年 9 月 24 日
Meilisearch is too slow

Meilisearch 太慢了

在这篇博文中,我们将探讨 Meilisearch 文档索引器所需的增强功能。我们将讨论当前的索引引擎、其缺点以及优化性能的新技术。

Clément Renault
Clément Renault2024 年 8 月 20 日