torann / laravel-hunt
使用 Elasticsearch 进行 Laravel 模型统一搜索。
Requires
- php: >=5.5.0
- elasticsearch/elasticsearch: ~5.0
- illuminate/config: ~5.2
- illuminate/database: ~5.2
- illuminate/support: ~5.2
Requires (Dev)
- mockery/mockery: ^0.9.4
- phpunit/phpunit: ~4.2|~5.0
README
使用 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
字段。
有关更多信息,请参阅配置文件以获取详细信息。