pomirleanu / eloquent-elastic
为 Laravel Eloquent 模型提供 Elasticsearch 索引和管理功能。
Requires
- php: >=5.6.4
- elasticsearch/elasticsearch: 2.2.*
- laravel/framework: 5.4.*
- monolog/monolog: 1.*
- nesbot/carbon: 1.*
- ongr/elasticsearch-dsl: 2.*
Requires (Dev)
- mockery/mockery: ^0.9.5
- phpunit/phpunit: ^5.7
README
Elodex 提供了一种简单的方法来实现您的 Laravel Eloquent 模型与 Elasticsearch 索引的同步。
您的 Eloquent 数据库将保持您的数据源,同时您可以使用 Elasticsearch 的全部能力对模型进行基于索引的搜索。
目录
要求
Elodex 需要 Elasticsearch 2.0 或更高版本,PHP v5.6+ 和 Laravel 5.1+。
除了技术要求外,您还应深入了解 Eloquent,并熟悉基本的 Elasticsearch 术语 以及 Elasticsearch 的一般工作方式。
分支模型
该项目使用 Gitflow 分支模型
- master 分支包含最新的 稳定 版本
- develop 分支包含最新的 不稳定 开发版本
- 所有稳定版本都使用语义版本进行标记
安装
您可以通过 Composer 直接将 Elodex 添加到项目中
$ composer require "elodex/elodex=~2.0"
或者您可以在 composer.json
文件的 require
部分手动添加所需的条目
"require": { "elodex/elodex": "~2.0" }
Laravel 集成
要将 Elodex 集成到您的 Laravel 应用程序中,您首先需要将 IndexServiceProvider
添加到应用程序配置的服务提供者列表中。
您可以通过编辑 config
文件夹中的 app.php
文件来实现此操作。搜索 providers
部分,并添加一个新条目
/* |-------------------------------------------------------------------------- | Autoloaded Service Providers |-------------------------------------------------------------------------- | */ 'providers' => [ ... \Elodex\IndexServiceProvider::class, ],
配置
尽管 Elodex 附带默认配置,该配置应该适用于标准的 Elasticsearch 安装,但您通常希望指定自己的设置。您可以通过发布标准配置文件到您的应用程序来实现
$ php artisan vendor:publish --provider="Elodex\IndexServiceProvider"
这将把一个标准配置复制到 config/elodex.php
。请确保您的 Elasticsearch 主机配置正确,并指定一个默认索引名称,该名称将默认用于您的所有索引 Eloquent 模型。
/* |-------------------------------------------------------------------------- | Default Index Name |-------------------------------------------------------------------------- | */ 'default_index' => 'my_app_index',
扩展您的 Eloquent 模型类
向您的 Eloquent 模型类添加索引功能有两种方法。
1. 使用 IndexedModel 特性
要将基本索引功能添加到现有的 Eloquent 模型中,您可以包含 IndexedModel
特性,该特性会自动为您实现所需的 Contracts\IndexedModel
接口。
<?php namespace App; use Illuminate\Database\Eloquent\Model as BaseModel; use Elodex\Contracts\IndexedModel as IndexedModelContract; use Elodex\IndexedModel as IndexedModelTrait; class Model extends BaseModel implements IndexedModelContract { use IndexedModelTrait;
请注意,该特性实现了 newCollection
方法。您必须确保您的 Eloquent 类没有覆盖此方法,否则您将失去在由模型查询返回的集合上使用索引操作便捷的方式。
IndexedModel
特性为您做了三件事
- 它实现了
Contracts\IndexedModel
接口,从而使模型能够添加到索引存储库中。 - 它为访问您模型类的默认索引管理器和默认索引存储库提供了一个便捷的方法。
- 它添加了与索引存储库交互的方法。这包括将您的模型实例添加到索引存储库、删除它们以及执行基于索引的搜索。
2. 从 Elodex 模型类派生
如果您的现有模型直接从 Eloquent 基类继承,从抽象的 Elodex Model
类派生比使用特性更好。这使您有机会覆盖并扩展 IndexedModel
特性中添加的现有方法,而无需完全重写它们。
一个常见的用例是,如果您想更改模型文档的创建。
索引仓库
所有索引模型文档都由类型为 IndexRepository
的存储库管理。每个模型类都有自己的默认索引存储库,使用索引中的自己的类型。
这意味着您不能将索引存储库共享给不同的模型类,这样做将在运行时导致异常。
可以通过 getClassIndexRepository
静态方法访问类使用的默认索引存储库。
$repository = User::getClassIndexRepository();
通常不需要直接访问索引存储库,因为索引模型类提供了更便捷的方法来管理存储库条目。
Elasticsearch 客户端
Elodex 使用 官方 PHP 低位客户端 Elasticsearch。通常不需要直接访问此客户端,但 Elodex 使客户端实例在全局范围内可用,以便您需要执行一些自定义或原始查询。
$client = app('elodex.client');
您还可以使用 ElasticsearchClientManager
类进行依赖注入以获取客户端实例。
缓存
可以从配置文件中启用。只有在使用
->getModels()
从 MySQL 缓存 eloquent 查询时,才会从缓存中提供所需的信息。
您必须为需要缓存的模块创建同步,并在需要缓存的模型中设置缓存键前缀,如果不设置此前缀,则不会缓存。
protected $elastic_cache_prefix = 'cache_prefix_';
文档
详细的 Elodex 文档可以在这里找到:https://github.com/Elodex/Documentation/tree/develop。
变更日志
更改日志可以在这里找到:https://github.com/pomirleanu/eloquent-elastic/blob/HEAD/CHANGELOG.md。