torann/laravel-hunt

使用 Elasticsearch 进行 Laravel 模型统一搜索。

0.5.5 2017-06-02 22:22 UTC

This package is auto-updated.

Last update: 2024-09-08 09:53:46 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

使用 Elasticsearch 进行 Laravel 模型统一搜索。Laravel Hunt 使用了 官方 Elasticsearch PHP API。要开始使用,您应该对 Elasticsearch 的工作原理有基本的了解(索引、类型、映射等)。

Elasticsearch 要求

您必须运行 Elasticsearch 5.0 或更高版本。

安装

Composer

在命令行运行

$ composer require torann/laravel-hunt

Laravel

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

'providers' => [

    LaravelHunt\LaravelHuntServiceProvider::class,

]

Lumen

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

$app->register(LaravelHunt\LaravelHuntServiceProvider::class);

发布配置

从项目的根目录运行以下命令

$ php artisan vendor:publish --provider="LaravelHunt\LaravelHuntServiceProvider" --tag=config

将配置文件发布到 config/hunt.php

索引和映射

虽然您可以通过 Elasticsearch API 构建索引和映射,但您也可以使用一些辅助方法直接从模型中构建索引和类型。

对于自定义分析器,您可以在 config/hunt.php 文件中设置一个 settings 属性

[
    'settings' => [
         'number_of_shards' => 1,
         'analysis' => [
             'filter' => [
                 'autocomplete_filter' => [
                     'type' => 'edge_ngram',
                     'min_gram' => 1,
                     'max_gram' => 20,
                 ],
             ],
             'analyzer' => [
                 'autocomplete' => [
                     'type' => 'custom',
                     'tokenizer' => 'standard',
                     'filter' => [
                         'lowercase',
                         'autocomplete_filter',
                     ],
                 ],
             ],
         ],
     ],
]

对于映射,您可以在模型中设置一个 mappingProperties 属性,并使用一些映射函数

protected $mappingProperties = [
   'title' => [
        'type' => 'string',
        'analyzer' => 'standard'
    ]
];

Artisan 命令

hunt:install

创建 Elasticsearch 索引。

hunt:uninstall

删除 Elasticsearch 索引。

hunt:map <model>

初始化 Eloquent 模型映射。

参数

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

hunt:import <model>

导入 Eloquent 模型中的所有条目。如果尚未设置,这将初始化模型映射。

参数

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

hunt:flush <model>

从索引中清除模型的所有记录。

参数

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

索引

一旦您将 LaravelHunt\Huntable 特性添加到模型中,您只需保存模型实例,它就会自动添加到索引中。

$post = new App\Post;

// ...

$post->save();

注意:如果模型记录已在您的索引中,则将其更新。如果它不存在于索引中,则将其添加。

更新记录

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

$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();

由于 Hunt 搜索返回 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);

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

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

{{ $posts->links() }}

多语言

此功能为实验性

Laravel Hunt 可以通过将语言代码附加到索引类型来支持多种语言,因此当系统执行搜索时,它将只查找当前系统本地化后缀索引类型中的数据。为了实现这一点,模型需要使用 LaravelHunt\Localized 特性或类似的特性,并且模型需要具有 locale 字段。

有关更多信息,请参阅配置文件以获取详细信息。