harisant/laravel-elasticsearch

在Laravel应用中轻松使用官方PHP ElasticSearch客户端。

dev-main 2023-12-03 05:27 UTC

This package is auto-updated.

Last update: 2024-10-03 07:24:56 UTC


README

在Laravel或Lumen应用中轻松使用官方Elastic Search客户端

Build Status Total Downloads Latest Stable Version Latest Stable Version License

安装和配置

通过composer安装mailerlite/laravel-elasticsearch包的当前版本

composer require mailerlite/laravel-elasticsearch

如果你使用ElasticSearch版本5,那么安装此包的版本2

composer require mailerlite/laravel-elasticsearch:^2

Laravel

包的服务提供程序将自动注册其服务提供程序。

发布配置文件

php artisan vendor:publish --provider="MailerLite\LaravelElasticsearch\ServiceProvider"
通过.env文件进行替代配置方法

按照上述建议发布配置文件后,您可以通过向应用程序的.env文件中添加以下内容来配置ElasticSearch(使用适当的值)

ELASTICSEARCH_HOST=localhost
ELASTICSEARCH_PORT=9200
ELASTICSEARCH_SCHEME=http
ELASTICSEARCH_USER=
ELASTICSEARCH_PASS=

如果您通过API密钥登录,则需要填写这些值

ELASTICSEARCH_API_ID=
ELASTICSEARCH_API_KEY=
连接到AWS Elasticsearch服务

如果您连接到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
    ],
],

如果您有一个在supervisor中运行的作业,您必须使用Closure。这样,凭证将在运行时更新。

<?php
// config/elasticsearch.php

$provider = \Aws\Credentials\CredentialProvider::instanceProfile();
$memoizedProvider = \Aws\Credentials\CredentialProvider::memoize($provider);

...

'hosts' => [
    [
        ...
        'aws_credentials' => $memoizedProvider
    ],
],

如果您使用php artisan config:cache,您不能在配置文件中使用Closure,可以这样调用它

<?php
// config/elasticsearch.php

...

'hosts' => [
    [
        ...
        'aws_credentials' => [\Aws\Credentials\CredentialProvider::class, 'defaultProvider'],
    ],
],

Lumen

如果您使用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);

希望使用外观的Lumen用户可以通过编辑bootstrap/app.php文件来包含以下内容

$app->withFacades(true, [
    ...
    MailerLite\LaravelElasticsearch\Facade::class => 'Elasticsearch',
    ...
]);

不使用外观的Lumen用户需要使用依赖注入或应用程序容器来获取ES服务对象

// using injection:
public function handle(\Mailerlite\LaravelElasticsearch\Manager $elasticsearch)
{
    $elasticsearch->ping();
}

// using application container:
$elasticSearch = $this->app('elasticsearch');

当然,依赖注入和应用容器也适用于Laravel应用程序。

高级用法

由于该包是围绕官方Elastic客户端的包装,因此您可以使用此包做很多事情。您不仅可以执行标准CRUD操作,还可以通过“命名空间”命令程序化地监控您的Elastic集群的健康状况,备份或更改它。这些操作中的某些操作是通过“命名空间”命令完成的,该包愉快地支持这些命令。

获取索引的统计信息

$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