torann/laravel-cloudsearch

在亚马逊云搜索上索引和搜索Laravel模型。

0.1.5 2017-10-13 16:35 UTC

This package is auto-updated.

Last update: 2024-09-08 09:47:29 UTC


README

Latest Stable Version Total Downloads Patreon donate button Donate weekly to this project using Gratipay Donate to this project using Flattr Donate to this project using Paypal

在亚马逊云搜索上索引和搜索Laravel模型。要开始,您应该对云搜索的工作原理有基本的了解。

安装

Composer

从命令行运行

$ composer require torann/laravel-cloudsearch

Laravel

安装完成后,您需要将服务提供程序与应用程序注册。打开 config/app.php 并找到 providers 键。

'providers' => [

    LaravelCloudSearch\LaravelCloudSearchServiceProvider::class,

]

Lumen

对于Lumen,在 bootstrap/app.php 中注册服务提供程序。

$app->register(LaravelCloudSearch\LaravelCloudSearchServiceProvider::class);

发布配置

从项目根目录运行此命令

$ php artisan vendor:publish --provider="LaravelCloudSearch\LaravelCloudSearchServiceProvider" --tag=config

配置文件将被发布到 config/cloud-search.php

迁移

该包使用批处理队列系统在AWS上更新文档。这是为了帮助减少对API的调用次数(长期来看可以节省费用)。

php artisan vendor:publish --provider="LaravelCloudSearch\LaravelCloudSearchServiceProvider" --tag=migrations

从项目根目录运行此命令以生成存储货币的表

$ php artisan migrate

字段

该包提供了一个简单的字段管理命令,以便更好地管理字段。这是完全可选的,因为您也可以在AWS控制台中管理它们。

注意:如果您选择不使用此命令来管理或设置您的字段,您仍然需要将字段 searchable_type 添加为 literal。这用于存储模型类型。

它们可以在 config/cloud-search.php 文件中的 fields 属性下找到

'fields' => [
    'title' => 'text',
    'status' => 'literal',
],

Artisan 命令

search:fields

初始化Eloquent模型映射。

search:index <model>

要索引的模型名称或以逗号分隔的模型名称。

参数

 model               Name or comma separated names of the model(s) to index

search:flush <model>

从索引中清除所有模型文档。

参数

 model               Name or comma separated names of the model(s) to index

search:queue

通过队列更新和删除操作来减少对云搜索服务器的调用次数。

索引

一旦将 LaravelCloudSearch\Eloquent\Searchable 特性添加到模型中,所有您需要做的就是保存模型实例,当运行 search:queue 命令时,它将自动添加到您的索引中。

$post = new App\Post;

// ...

$post->save();

注意:如果模型文档已经索引,则它将简单地更新。如果它不存在,则将其添加。

更新文档

要更新索引模型,只需更新模型实例的属性并将模型 save 到数据库中。该包将自动将更改持久化到您的搜索索引。

$post = App\Post::find(1);

// Update the post...

$post->save();

删除文档

要从索引中删除文档,只需从数据库中 delete 模型。这种删除方式与 软删除 模型兼容。

$post = App\Post::find(1);

$post->delete();

搜索

您可以使用 search 方法开始搜索模型。搜索方法接受一个字符串,该字符串将用于搜索您的模型。然后,将 get 方法链接到搜索查询以检索与给定搜索查询匹配的Eloquent模型。

$posts = App\Post::search('Kitten fluff')->get();

由于包搜索返回Eloquent模型的集合,因此您甚至可以直接从路由或控制器返回结果,并且它们将自动转换为JSON。

use Illuminate\Http\Request;

Route::get('/search', function (Request $request) {
    return App\Post::search($request->search)->get();
});

分页

除了检索模型集合外,您还可以使用 paginate 方法分页搜索结果。此方法将返回一个 Paginator 实例,就像您分页传统Eloquent查询一样。

$posts = App\Post::search('Kitten fluff')->paginate();

您可以通过将数量作为第一个参数传递给 paginate 方法来指定每页要检索多少个模型。

$posts = App\Post::search('Kitten fluff')->paginate(15);

一旦检索到结果,您就可以使用 Blade 显示结果和渲染分页链接,就像您对传统 Eloquent 查询进行了分页一样。

<div class="container">
    @foreach ($posts as $post)
        {{ $post->title }}
    @endforeach
</div>

{{ $posts->links() }}

基本构建器使用方法

初始化一个构建器实例

$query = app(\LaravelCloudSearch\CloudSearcher::class)->newQuery();

您可以像这样链式调用查询方法

$query->phrase('ford')
    ->term('National Equipment', 'seller')
    ->range('year', '2010');

使用 get()paginate() 方法提交查询并从 AWS 获取结果。

$results = $query->get();

在上面的示例中,我们没有设置搜索类型,这意味着返回的结果将匹配 CloudSearch 域上的任何文档。要细化您的搜索以针对特定模型,可以使用之前示例中所示的方法使用模型,或者使用 searchableType() 方法设置模型的类名(在模型实例调用中这是自动完成的)。

$query = app(\LaravelCloudSearch\CloudSearcher::class)->newQuery();

$results = $query->searchableType(\App\LawnMower::class)
    ->term('honda', 'name')
    ->get();

搜索查询运算符和嵌套查询

您可以使用 andornot 运算符来构建复合和嵌套查询。相应的 and()or()not() 方法期望闭包作为它们的参数。您还可以链式调用所有可用方法,并在闭包中嵌套更多子查询。

$query->or(function($builder) {
    $builder->phrase('ford')
        ->phrase('truck');
});

队列

为了减少对 CloudSearch 端点的批量请求次数(因为它们是收费的),使用了队列系统。这可以在 Laravel 的 任务调度 中设置。您可以使用计划任务频率选项来决定其运行的频率。请注意,这使用数据库来功能。

添加到 /app/Console/Kernel.php 的任务示例

    /**
     * Define the application's command schedule.
     *
     * @param  \Illuminate\Console\Scheduling\Schedule $schedule
     *
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
        $schedule->command('search:queue')->everyTenMinutes();
    }

多语言

此功能为实验性

Laravel CloudSearch 可以通过在索引类型后附加语言代码来支持多种语言,因此当系统执行搜索时,它将只查找当前系统区域设置的索引类型中存在的数据。为了使其正常工作,模型需要使用 LaravelCloudSearch\Eloquent\Localized 特性或类似特性。