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

全文搜索对于允许用户浏览内容丰富的网站至关重要。 在这篇文章中,我将向您展示如何为Laravel应用实现全文搜索。 实际上,我们将使用Laravel Scout库,该库使实现全文搜索变得轻松而有趣。

Laravel Scout到底是什么? 官方文档总结如下:

Laravel Scout提供了一个简单的基于驱动程序的解决方案,用于向Eloquent模型添加全文搜索。 通过使用模型观察器,Scout将自动使您的搜索索引与您的口才记录保持同步。

基本上,Laravel Scout是一个库,它在模型数据发生更改时管理索引的操纵。 将为数据建立索引的位置取决于使用Scout库配置的驱动程序。

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

我们将从安装Scout和Algolia服务器库开始,并且在继续进行过程中,我们将通过一个真实的示例来演示如何索引和搜索数据。

服务器配置

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

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

$composer require laravel/scout

就Scout库安装而言,仅此而已。 现在我们已经安装了Scout库,让我们确保Laravel知道它。

使用Laravel,您可能已经了解了服务提供者的概念,它使您可以在应用程序中配置服务。 因此,每当您想在Laravel应用程序中启用新服务时,只需在config/app.php添加相关的服务提供者条目。

在我们的例子中,我们只需要将ScoutServiceProvider提供程序添加到config/app.php中的服务提供程序列表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...
         */
        Laravel\Tinker\TinkerServiceProvider::class,

        /*
         * 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,
],
...
...

现在,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文件中配置必要的设置,如以下代码片段所示。

 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),

    /*
    |--------------------------------------------------------------------------
    | 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,

    /*
    |--------------------------------------------------------------------------
    | 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', 'STQK4DEGMA'),
        'secret' => env('ALGOLIA_SECRET', '6ef572194f70201ed7ad102cc9f90e05'),
    ],

];

请注意,我们已将SCOUT_DRIVER的值设置为algolia驱动程序。 因此,需要在文件末尾配置Algolia驱动程序的必要设置。 基本上,您只需要设置从Algolia帐户获得的idsecret即可。

如您所见,我们正在从环境变量中获取值。 因此,请确保在.env文件中正确设置以下变量。

...
...
ALGOLIA_APP_ID=STQK4DEGMA
ALGOLIA_SECRET=6ef572194f70201ed7ad102cc9f90e05
...
...

最后,我们需要安装Algolia PHP SDK,该SDK将用于使用API​​与Algolia进行交互。 让我们使用以下代码片段所示的作曲器进行安装。

$composer require algolia/algoliasearch-client-php

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

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

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

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

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

这样, 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库通过提供以下工匠命令使此操作变得容易。

$php artisan scout:import "App\Post"

那应该一次性导入Post模型的所有记录! 它们在导入后就立即建立索引,因此我们已经准备好查询记录。 继续浏览Algolia仪表板,以查看导入的记录和其他实用程序。

总共如何运作

在本节中,我们将创建一个示例,演示如何执行与Algolia索引实时同步的搜索和CRUD操作。

继续并使用以下内容创建app/Http/Controllers/SearchController.php文件。

get();
        
        // do the usual stuff here
        foreach ($posts as $post) {
          // ...
        }
    }

    public function add()
    {
        // this post should be indexed at Algolia right away!
        $post = new Post;
        $post->setAttribute('name', 'Another Post');
        $post->setAttribute('user_id', '1');
        $post->save();
    }
    
    public function delete()
    {
        // this post should be removed from the index at Algolia right away!
        $post = Post::find(1);
        $post->delete();
    }
}

当然,我们还需要添加关联的路由。

Route::get('search/query', 'SearchController@query');
Route::get('search/add', 'SearchController@add');
Route::get('search/delete', 'SearchController@delete');

让我们看一下query方法,看看如何在Algolia中执行搜索。

public function query()
{
    // queries to Algolia search index and returns matched records as Eloquent Models
    $posts = Post::search('title')->get();
    
    // do the usual stuff here
    foreach ($posts as $post) {
        // ...
    }
}

回想一下,我们通过添加Searchable特征使Post模型可搜索。 因此, Post模型可以使用search方法从Algolia索引中检索记录。 在上面的示例中,我们试图获取与title关键字匹配的记录。

接下来,有一个add方法模仿添加新帖子记录的工作流程。

public function add()
{
    // this post should be indexed at Algolia right away!
    $post = new Post;
    $post->setAttribute('name', 'Another Post');
    $post->setAttribute('user_id', '1');
    $post->save();
}

上面的代码没什么花哨的; 它只是使用Post模型创建一个新的post记录。 但是Post模型实现了Searchable特性,因此Laravel这次通过索引在Algolia中新创建的记录来做一些额外的工作。 如您所见,索引是实时完成的。

最后是delete方法。 让我们也经历一下。

public function delete()
{
    // this post should be removed from the index at Algolia right away!
    $post = Post::find(1);
    $post->delete();
}

如您所料,一旦从数据库中删除该记录,就会立即从Algolia索引中删除该记录。

基本上,如果您想使现有模型可搜索,则无需您费力。 一切都由Scout库使用模型观察器处理。

这也将我们带到了本文的结尾!

结论

今天,我们讨论了如何使用Laravel Scout库在Laravel中实现全文搜索。 在此过程中,我们通过必要的安装和一个实际示例进行了演示。

请使用下面的评论供稿随意询问您是否有任何疑问或疑问!

翻译自: https://code.tutsplus.com/tutorials/how-to-setup-a-full-text-search-using-scout-in-laravel--cms-30702

你可能感兴趣的:(如何在Laravel中使用Scout设置全文本搜索)