在 Laravel 或 Lumen 应用程序中使用官方 Elastic Search 客户端的简单方法。
通过composer安装当前版本的mailerlite/laravel-elasticsearch
包:
composer require mailerlite/laravel-elasticsearch
如果您使用的是 ElasticSearch 版本 5,请安装此软件包的版本 2:
composer require mailerlite/laravel-elasticsearch:^2
包的服务提供者将自动注册其服务提供者。
发布配置文件:
php artisan vendor:publish --provider= " MailerLiteLaravelElasticsearchServiceProvider "
按照上面的建议发布配置文件后,您可以通过将以下内容添加到应用程序的.env
文件(使用适当的值)来配置 ElasticSearch:
ELASTICSEARCH_HOST =localhost
ELASTICSEARCH_PORT =9200
ELASTICSEARCH_SCHEME =http
ELASTICSEARCH_USER =
ELASTICSEARCH_PASS =
如果您通过 API 密钥登录,则需要填写以下值:
ELASTICSEARCH_API_ID =
ELASTICSEARCH_API_KEY =
如果您要连接到 Amazon AWS 上的 ElasticSearch 实例,那么您还需要composer require aws/aws-sdk-php:^3.80
并将以下内容添加到您的.env
文件中:
AWS_ELASTICSEARCH_ENABLED =true
AWS_REGION =...
AWS_ACCESS_KEY_ID =...
AWS_SECRET_ACCESS_KEY =...
如果您必须使用具有自定义凭证的其他身份验证方法(即instanceProfile()
),则必须发布配置文件并使用aws_credentials :
<?php
// config/elasticsearch.php
$ provider = Aws Credentials CredentialProvider:: instanceProfile ();
$ memoizedProvider = Aws Credentials CredentialProvider:: memoize ( $ provider );
$ credentials = $ memoizedProvider ()-> wait ();
. . .
' hosts ' => [
[
' host ' => env ( ' ELASTICSEARCH_HOST ' , ' localhost ' ),
// For local development, the default Elasticsearch port is 9200.
// If you are connecting to an Elasticsearch instance on AWS, you probably want to set this to null
' port ' => env ( ' ELASTICSEARCH_PORT ' , 9200 ),
' scheme ' => env ( ' ELASTICSEARCH_SCHEME ' , null ),
' user ' => env ( ' ELASTICSEARCH_USER ' , null ),
' pass ' => env ( ' ELASTICSEARCH_PASS ' , null ),
// If you are connecting to an Elasticsearch instance on AWS, you will need these values as well
' aws ' => env ( ' AWS_ELASTICSEARCH_ENABLED ' , false ),
' aws_region ' => env ( ' AWS_REGION ' , '' ),
' aws_key ' => env ( ' AWS_ACCESS_KEY_ID ' , '' ),
' aws_secret ' => env ( ' AWS_SECRET_ACCESS_KEY ' , '' )
' aws_credentials ' => $ credentials
],
],
如果您有一个在主管中运行的作业,则必须使用闭包。这样,凭证将在运行时更新。
<?php
// config/elasticsearch.php
$ provider = Aws Credentials CredentialProvider:: instanceProfile ();
$ memoizedProvider = Aws Credentials CredentialProvider:: memoize ( $ provider );
. . .
' hosts ' => [
[
...
' aws_credentials ' => $ memoizedProvider
],
],
如果您使用php artisan config:cache
,则无法在配置文件中包含闭包,请像这样调用它:
<?php
// config/elasticsearch.php
. . .
' hosts ' => [
[
...
' aws_credentials ' => [ Aws Credentials CredentialProvider::class, ' defaultProvider ' ],
],
],
如果您使用 Lumen,请在bootstrap/app.php
中注册服务提供商和配置:
$ app -> register ( MailerLite LaravelElasticsearch ServiceProvider::class);
$ app -> configure ( ' elasticsearch ' );
手动将配置文件复制到您的应用程序。
Elasticsearch
门面只是 ES 客户端的入口点,因此之前您可能使用过:
use Elasticsearch ClientBuilder ;
$ data = [
' body ' => [
' testField ' => ' abc '
],
' index ' => ' my_index ' ,
' type ' => ' my_type ' ,
' id ' => ' my_id ' ,
];
$ client = ClientBuilder:: create ()-> build ();
$ return = $ client -> index ( $ data );
您现在可以简单地将最后两行替换为:
use Elasticsearch ;
$ return = Elasticsearch:: index ( $ data );
这将在默认连接上运行该命令。您可以在任何连接上运行命令(请参阅配置文件中的defaultConnection
设置和connections
数组)。
$ return = Elasticsearch:: connection ( ' connectionName ' )-> index ( $ data );
希望使用 Facades 的 Lumen 用户可以通过编辑bootstrap/app.php
文件来添加以下内容:
$ app -> withFacades ( true , [
...
MailerLite LaravelElasticsearch Facade::class => ' Elasticsearch ' ,
...
]);
不使用 Facades 的 Lumen 用户需要使用依赖注入或应用程序容器来获取 ES 服务对象:
// using injection:
public function handle ( Mailerlite LaravelElasticsearch Manager $ elasticsearch )
{
$ elasticsearch -> ping ();
}
// using application container:
$ elasticSearch = $ this -> app ( ' elasticsearch ' );
当然,依赖注入和应用程序容器也适用于 Laravel 应用程序。
因为该包是官方 Elastic 客户端的包装器,所以您可以使用该包做几乎任何事情。您不仅可以执行标准的 CRUD 操作,还可以通过编程方式监控弹性集群的运行状况、对其进行备份或进行更改。其中一些操作是通过“命名空间”命令完成的,这个包很高兴支持这些命令。
要获取索引的统计信息:
$ stats = Elasticsearch:: indices ()-> stats ([ ' index ' => ' my_index ' ]);
$ stats = Elasticsearch:: nodes ()-> stats ();
$ stats = Elasticsearch:: cluster ()-> stats ();
创建和恢复快照(首先阅读有关创建存储库路径和插件的 Elastic 文档):
$ response = Elasticsearch:: snapshots ()-> create ( $ params );
$ response = Elasticsearch:: snapshots ()-> restore ( $ params );
删除整个索引(小心!):
$ response = Elasticsearch:: indices ()-> delete ([ ' index ' => ' my_index ' ]);
请记住,这个包是一个薄薄的包装,围绕着大量非常复杂且记录良好的 Elastic 功能。有关这些功能以及用于调用它们的方法和参数的信息可以在 Elastic 文档中找到。您可以通过 Elastic 论坛和 Stack Overflow 等网站获取使用它们的帮助。
该软件包还提供了一些有用的控制台命令。
检查索引是否存在:
php artisan laravel-elasticsearch:utils:index-exists < your_elasticsearch_index_name >
创建索引:
php artisan laravel-elasticsearch:utils:index-create < your_elasticsearch_index_name >
删除索引:
php artisan laravel-elasticsearch:utils:index-delete < your_elasticsearch_index_name >
创建或更新索引映射:注意:索引映射文件必须包含 Elasticsearch 期望的有效 JSON 映射定义,例如:
{
"body" : {
"_source" : {
"enabled" : true
},
"properties" : {
"id" : {
"type" : " keyword "
},
"property_1" : {
"type" : " text "
},
"property_2" : {
"type" : " text "
}
}
}
}
php artisan laravel-elasticsearch:utils:index-create-or-update-mapping < your_elasticsearch_index_name > < json_mapping_absolute_file_path >
创建别名:
php artisan laravel-elasticsearch:utils:alias-create < your_elasticsearch_index_name > < your_elasticsearch_alias_name >
从别名中删除索引:
php artisan laravel-elasticsearch:utils:alias-remove-index < your_elasticsearch_index_name > < your_elasticsearch_alias_name >
在别名上切换索引(对于新索引的零停机发布很有用):
php artisan laravel-elasticsearch:utils:alias-switch-index < your_NEW_elasticsearch_index_name > < your_OLD_elasticsearch_index_name > < your_elasticsearch_alias_name >
感谢所有为这个项目做出贡献的人!
请使用 Github 报告错误、提出意见或建议。
请参阅 CONTRIBUTING.md 了解如何贡献更改。
laravel-elasticsearch 是由 Colin Viebrock 编写的,并在 MIT 许可证下发布。它由 MailerLite 维护和开发
版权所有 (c) 2023 MailerLite