Fir站长导航 > 站长资讯 > 教程分享 >

如何在 Laravel 中使用 Scout 设置全文搜索

2022-06-15
全文搜索对于允许用户浏览内容丰富的网站至关重要。在这篇文章中,我将向您展示如何为 Laravel 应用程序实现全文搜索。事实上,我们将使用 Laravel Scout 库,它使全文搜索的实现变得简单而有趣。

Laravel Scout 到底是什么?


官方文档是这样总结的: Laravel Scout 提供了一个简单的、基于驱动程序的解决方案,用于将全文搜索添加到您的 Eloquent 模型中。使用模型观察者,Scout 将自动使您的搜索索引与您的 Eloquent 记录保持同步。

基本上,Laravel Scout 是一个在模型数据发生变化时管理索引操作的库。数据将被索引的位置取决于您使用 Scout 库配置的驱动程序。

到目前为止,Laravel Scout 库支持 Algolia,这是一个基于云的搜索引擎 API,我们将在本文中使用它来演示全文搜索的实现。

我们将从安装 Scout 和 Algolia 服务器库开始,随着我们继续,我们将通过一个真实示例来演示如何索引和搜索数据。

服务器配置


在本节中,我们将安装所需的依赖项,以使 Scout 库与 Laravel 一起使用。安装后,我们需要进行相当多的配置,以便 Laravel 可以检测到 Scout 库。

让我们继续使用 Composer 安装 Scout 库。


$composer require laravel/scout

就 Scout 库安装而言,差不多就是这样。现在我们已经安装了 Scout 库,让我们确保 Laravel 知道它。

使用 Laravel,您可能知道服务提供者的概念,它允许您在应用程序中配置服务。

因此,每当您想在 Laravel 应用程序中启用新服务时,您只需在 config/app.php 中添加关联的服务提供者条目。

如果你还不熟悉 Laravel 服务提供者,我强烈建议你帮自己一个忙,阅读这篇介绍 Laravel 服务提供者基础的介绍性文章。

在我们的例子中,我们只需要将 ScoutServiceProvider 提供者添加到 config/app.php 中的服务提供者列表中,如下面的代码片段所示。


...
...
'providers' => [
    /*
     * Laravel Framework Service Providers...
     */
    Illuminate\Auth\AuthServiceProvider::class,
    Illuminate\Broadcasting\BroadcastServiceProvider::class,
    Illuminate\Bus\BusServiceProvider::class,
    Illuminate\Cache\CacheServiceProvider::class,
    Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
    Illuminate\Cookie\CookieServiceProvider::class,
    Illuminate\Database\DatabaseServiceProvider::class,
    Illuminate\Encryption\EncryptionServiceProvider::class,
    Illuminate\Filesystem\FilesystemServiceProvider::class,
    Illuminate\Foundation\Providers\FoundationServiceProvider::class,
    Illuminate\Hashing\HashServiceProvider::class,
    Illuminate\Mail\MailServiceProvider::class,
    Illuminate\Notifications\NotificationServiceProvider::class,
    Illuminate\Pagination\PaginationServiceProvider::class,
    Illuminate\Pipeline\PipelineServiceProvider::class,
    Illuminate\Queue\QueueServiceProvider::class,
    Illuminate\Redis\RedisServiceProvider::class,
    Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
    Illuminate\Session\SessionServiceProvider::class,
    Illuminate\Translation\TranslationServiceProvider::class,
    Illuminate\Validation\ValidationServiceProvider::class,
    Illuminate\View\ViewServiceProvider::class,
 
    /*
     * Package Service Providers...
     */
 
    /*
     * Application Service Providers...
     */
    App\Providers\AppServiceProvider::class,
    App\Providers\AuthServiceProvider::class,
    // App\Providers\BroadcastServiceProvider::class,
    App\Providers\EventServiceProvider::class,
    App\Providers\RouteServiceProvider::class,
    Laravel\Scout\ScoutServiceProvider::class,
],
...
...
1

现在,Laravel 知道了 ScoutServiceProvider 服务提供者。

Scout 库带有一个配置文件,允许我们设置 API 凭据。 让我们继续使用以下命令发布 Scout 库提供的资产。



$ php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"
Copied File [/vendor/laravel/scout/config/scout.php] To [/config/scout.php]
Publishing complete.

如您所见,它已将 vendor/laravel/scout/config/scout.php 文件复制到 config/scout.php。

接下来,继续使用 Algolia 创建一个帐户,因为我们首先需要 API 凭据。获得 API 信息后,让我们继续在 config/scout.php 文件中配置必要的设置,如以下代码段所示。


<?php
 
return [
 
    /*
    |--------------------------------------------------------------------------
    | Default Search Engine
    |--------------------------------------------------------------------------
    |
    | This option controls the default search connection that gets used while
    | using Laravel Scout. This connection is used when syncing all models
    | to the search service. You should adjust this based on your needs.
    |
    | Supported: "algolia", "null"
    |
    */
 
    'driver' => env('SCOUT_DRIVER', 'algolia'),
 
    /*
    |--------------------------------------------------------------------------
    | Index Prefix
    |--------------------------------------------------------------------------
    |
    | Here you may specify a prefix that will be applied to all search index
    | names used by Scout. This prefix may be useful if you have multiple
    | "tenants" or applications sharing the same search infrastructure.
    |
    */
 
    'prefix' => env('SCOUT_PREFIX', ''),
 
    /*
    |--------------------------------------------------------------------------
    | Queue Data Syncing
    |--------------------------------------------------------------------------
    |
    | This option allows you to control if the operations that sync your data
    | with your search engines are queued. When this is set to "true" then
    | all automatic data syncing will get queued for better performance.
    |
    */
 
    'queue' => env('SCOUT_QUEUE', false),
 
    /*
    |--------------------------------------------------------------------------
    | Database Transactions
    |--------------------------------------------------------------------------
    |
    | This configuration option determines if your data will only be synced
    | with your search indexes after every open database transaction has
    | been committed, thus preventing any discarded data from syncing.
    |
    */
 
    'after_commit' => false,
 
    /*
    |--------------------------------------------------------------------------
    | Chunk Sizes
    |--------------------------------------------------------------------------
    |
    | These options allow you to control the maximum chunk size when you are
    | mass importing data into the search engine. This allows you to fine
    | tune each of these chunk sizes based on the power of the servers.
    |
    */
 
    'chunk' => [
        'searchable' => 500,
        'unsearchable' => 500,
    ],
 
    /*
    |--------------------------------------------------------------------------
    | Soft Deletes
    |--------------------------------------------------------------------------
    |
    | This option allows you to control whether to keep soft deleted records in
    | the search indexes. Maintaining soft deleted records can be useful
    | if your application still needs to search for the records later.
    |
    */
 
    'soft_delete' => false,
 
    /*
    |--------------------------------------------------------------------------
    | Identify User
    |--------------------------------------------------------------------------
    |
    | This option allows you to control whether to notify the search engine
    | of the user performing the search. This is sometimes useful if the
    | engine supports any analytics based on this application's users.
    |
    | Supported engines: "algolia"
    |
    */
 
    'identify' => env('SCOUT_IDENTIFY', false),
 
    /*
    |--------------------------------------------------------------------------
    | Algolia Configuration
    |--------------------------------------------------------------------------
    |
    | Here you may configure your Algolia settings. Algolia is a cloud hosted
    | search engine which works great with Scout out of the box. Just plug
    | in your application ID and admin API key to get started searching.
    |
    */
 
    'algolia' => [
        'id' => env('ALGOLIA_APP_ID', 'XXXXXX'),
        'secret' => env('ALGOLIA_SECRET', 'XXXXXXXXXXXXXXXXXXXXXXXX'),
    ],
 
];

请注意,我们已将 SCOUT_DRIVER 的值设置为 algolia 驱动程序。因此,您需要在文件末尾配置 Algolia 驱动程序的必要设置。

基本上,您只需要设置从 Algolia 帐户获得的 ID 和密码。 如您所见,我们正在从环境变量中获取值。因此,让我们确保我们在 .env 文件中正确设置了以下变量。


...
...
ALGOLIA_APP_ID=XXXXXX
ALGOLIA_SECRET=XXXXXXXXXXXXXXXXXXXXXXXXXXXX
...
...

最后,我们需要安装 Algolia PHP SDK,它将用于使用 API 与 Algolia 进行交互。让我们使用 Composer 安装它,如以下代码段所示。

$composer require algolia/algoliasearch-client-php

有了这个,我们已经安装了所有必要的依赖项,以便将数据发布和索引到 Algolia 服务。

如何使模型可索引和可​​搜索



在上一节中,我们做了所有艰苦的工作来设置 Scout 和 Algolia 库,以便我们可以使用 Algolia 搜索服务索引和搜索数据。

在本节中,我们将通过一个示例来演示如何索引现有数据并从 Algolia 检索搜索结果。我假设您的应用程序中有一个默认的 Post 模型。

我们需要做的第一件事是将 Laravel\Scout\Searchable 特征添加到 Post 模型中。这使得 Post 模型可搜索;每次添加、更新或删除帖子记录时,Laravel 都会将帖子记录与 Algolia 索引同步。

<?php
namespace App;
 
use Illuminate\Database\Eloquent\Model;
use Laravel\Scout\Searchable;
 
class Post extends Model
{
    use Searchable;
    
    ...
    ...
}
这样一来,Post 模型就对搜索友好了!

接下来,我们想首先配置应该被索引的字段。当然,您不希望在 Algolia 中索引模型的所有字段以保持其有效和轻量级。

事实上,通常情况下,您不需要它。您可以在模型类中添加 toSearchableArray 来配置将被索引的字段。


/**
 * Get the indexable data array for the model.
 *
 * @return array
 */
public function toSearchableArray()
{
  $array = $this->toArray();
     
  return array('id' => $array['id'],'name' => $array['name']);
}


现在,我们已准备好将现有的 Post 记录导入 Algolia 并将其编入索引。事实上,Scout 库通过提供以下 artisan 命令使这变得简单。

$php artisan scout:import "App\Post"

这应该一次导入 Post 模型的所有记录!它们一被导入就会被索引,所以我们已经准备好查询记录了。继续探索 Algolia 仪表板以查看导入的记录和其他实用程序。


相关标签:

We use cookies in our website to improve our customer experience, we will not share these information to third party. By using this website you need to accept our Cookies and Privacy Policy. If you don't want to accept these Cookies, please change your browser setting. Find more.