aviationcode / elasticsearch
Laravel elasticsearch 和 eloquent 集成
Requires
- ext-json: *
- elasticsearch/elasticsearch: ^6.0|^7.0
- illuminate/support: ^11.0
Requires (Dev)
- mockery/mockery: ^1.1
- nunomaduro/larastan: ^2.0
- orchestra/testbench: ^9.0
- phpcompatibility/php-compatibility: ^9.3
- phpunit/phpunit: ^10.0
- sempro/phpunit-pretty-print: ^1.0
- squizlabs/php_codesniffer: ^3.8
README
此包封装了 elasticsearch/elasticsearch
composer 包并实现了 Laravel 集成。通过该包可以轻松使用 Eloquent 模型与 Elasticsearch 进行交互。
安装
通过 Composer
$ composer require aviationcode/elasticsearch
配置
默认情况下,我们使用 localhost:9200
来搜索您的 Elasticsearch 实例。如果使用的是默认设置,则无需进行任何配置。您可以使用以下 .env
设置来配置如何连接到您的 Elasticsearch 实例。
用法
通过使用 ElasticSearchable
特性或扩展 ElasticsearchModel
来配置模型以使用 Elasticsearch。
use AviationCode\Elasticsearch\Model\ElasticSearchable; use Illuminate\Database\Eloquent\Model; class Article extends Model { use ElasticSearchable; }
自定义映射属性
我们尝试从您的 $dates
数组和主键中检测 Elasticsearch 映射字段。我们无法正确检测其他字段。
在这种情况下,Elasticsearch 将自动尝试猜测映射字段,但建议您显式定义这些字段为正确的类型。
use AviationCode\Elasticsearch\Model\ElasticSearchable; use Illuminate\Database\Eloquent\Model; class Article extends Model { use ElasticSearchable; public $mapping = [ 'category' => ['type' => 'keyword'], 'properties' => ['type' => 'object', 'dynamic' => true], 'ip' => ['type' => 'ip'], ]; }
使用 Elasticsearch 文档以查找所有可用选项。
非数字键
当使用 UUID 或其他非数字键时,请确保正确配置您的模型。这将确保我们在模型映射中使用正确的映射。
use AviationCode\Elasticsearch\Model\ElasticSearchable; use Illuminate\Database\Eloquent\Model; class Article extends Model { use ElasticSearchable; protected $keyType = 'string'; }
自定义索引名称
您可能希望使用自定义名称或使用与您的 Eloquent 模型关联的现有索引名称。就像您可以定义使用的数据库表一样,您也可以定义使用的索引名称。
use AviationCode\Elasticsearch\Model\ElasticSearchable; use Illuminate\Database\Eloquent\Model; class Article extends Model { use ElasticSearchable; public $indexName = 'my_custom_index_name'; }
注意:您仍然可以使用 $indexVersion
在索引名称末尾添加 vX
。
版本化索引
如果您喜欢版本化索引名称,可以使用 $indexVersion
名称。这将将在索引名称末尾添加 _vX
,其中 X 是索引版本。
use AviationCode\Elasticsearch\Model\ElasticSearchable; use Illuminate\Database\Eloquent\Model; class Article extends Model { use ElasticSearchable; public $indexVersion = 2; }
查询
namespace App\Http\Controllers; use App\Article; use AviationCode\Elasticsearch\Facades\Elasticsearch; use AviationCode\Elasticsearch\Query\Dsl\Boolean\Filter; use AviationCode\Elasticsearch\Query\Dsl\Boolean\Must; use Illuminate\Http\Request; class ArticleController { public function index(Request $request) { return Elasticsearch::forModel(Article::class) ->query() ->filter(function (Filter $filter) use ($request) { if ($user = $request->query('user')) { $filter->term('user', $user); } }) ->must(function (Must $must) use ($request) { if ($query = $request->query('q')) { $must->queryString($query); } }) ->get(); } }
没有 Eloquent 模型。
namespace App\Http\Controllers; use App\Article; use AviationCode\Elasticsearch\Facades\Elasticsearch; use AviationCode\Elasticsearch\Query\Dsl\Boolean\Filter; use AviationCode\Elasticsearch\Query\Dsl\Boolean\Must; use Illuminate\Http\Request; class ArticleController { public function index(Request $request) { return Elasticsearch::query('article') ->filter(function (Filter $filter) use ($request) { if ($user = $request->query('user')) { $filter->term('user', $user); } }) ->must(function (Must $must) use ($request) { if ($query = $request->query('q')) { $must->queryString($query); } }) ->get(); } }
聚合
使用模型进行聚合。
namespace App\Http\Controllers; use App\Article; use AviationCode\Elasticsearch\Facades\Elasticsearch; class ArticlesPerUserPerDayController { public function index() { $qb = Elasticsearch::forModel(Article::class)->query(); $qb->aggregations() ->dateHistogram('date', 'created_at', '1d') ->terms('date.users', 'user'); return $qb->get()->aggregations; } }
不使用 Eloquent 模型进行聚合。
namespace App\Http\Controllers; use App\Article; use AviationCode\Elasticsearch\Facades\Elasticsearch; class ArticlesPerUserPerDayController { public function index() { $qb = Elasticsearch::query('article'); $qb->aggregations() ->dateHistogram('date', 'created_at', '1d') ->terms('date.users', 'user'); return $qb->get()->aggregations; } }
控制台命令
elastic:create-index
创建 Elasticsearch 索引
变更日志
有关最近更改的更多信息,请参阅 变更日志。
测试
$ composer test
贡献
有关详细信息以及待办事项列表,请参阅 contributing.md。
安全
如果您在 elasticsearch 包中发现了安全漏洞,请发送电子邮件至 Ken Andries 的 ken.andries.1992@gmail.com。所有安全漏洞都将得到及时处理。
鸣谢
许可证
许可证。有关更多信息,请参阅 许可证文件。