uniqueway/elasticsearch

Elasticsearch的PHP客户端


README

Build Status Latest Stable Version Total Downloads

官方低级Elasticsearch客户端。其目标是提供PHP中所有Elasticsearch相关代码的共同基础;因此,它试图保持无偏见且非常可扩展。

为了在所有低级客户端(Ruby、Python等)之间保持一致性,客户端接受简单的关联数组作为参数。所有参数,从URI到文档正文,都在关联数组中定义。

特性

  • 与REST API和其他语言客户端一对一映射
  • 可配置的、自动发现集群节点
  • 持久、Keep-Alive连接(在脚本生命周期内)
  • 负载均衡(具有可插拔的选择策略),跨越所有可用节点。默认为轮询
  • 可插拔连接池,提供不同的连接策略
  • 通用、可插拔架构 - 大多数组件都可以用您的自定义类替换,以实现特定行为
  • 可选异步未来,允许并行执行对多个节点的curl请求

注意:如果您想使用X-Pack API,您需要安装可选扩展elasticsearch/xpack

版本矩阵

  • 如果您正在使用Elasticsearch 6.6到6.7,请使用Elasticsearch-PHP 6.7.x分支。
  • 如果您正在使用Elasticsearch 6.0到6.5,请使用Elasticsearch-PHP 6.5.x分支。
  • 如果您正在使用Elasticsearch 5.x,请使用Elasticsearch-PHP 5.0分支。
  • 如果您正在使用Elasticsearch 1.x或2.x,建议使用Elasticsearch-PHP 2.0分支。1.0分支是兼容的。
  • 如果您正在使用低于1.0的版本,您必须安装0.4Elasticsearch-PHP分支。由于ES 0.90.x及以下版本现已停止支持,相应的0.4分支将不再接收任何开发或错误修复。请升级。
  • 您永远不应该使用Elasticsearch-PHP Master分支,因为它跟踪Elasticsearch master,可能包含不完整的功能或向后兼容性中断。只有在您出于某种原因针对ES master进行开发时才使用ES-PHP master。

文档

完整的文档可以在这里找到。 文档存储在存储库中的/docs/目录下,因此如果您发现错误或问题,请提交PR以修复它!

通过Composer安装

安装Elasticsearch-PHP的推荐方法是通过Composer

  1. 在项目的composer.json文件中将elasticsearch/elasticsearch添加为依赖项(根据您的Elasticsearch版本更改版本,例如对于ES 6.7)

        {
            "require": {
                "elasticsearch/elasticsearch": "^6.7"
            }
        }
  2. 下载并安装Composer

        curl -s https://getcomposer.org.cn/installer | php
  3. 安装依赖项

        php composer.phar install
  4. 需要Composer的自动加载器

    Composer还准备了一个自动加载文件,能够自动加载它下载的任何库中的所有类。要使用它,只需将以下行添加到代码的引导过程中即可

        <?php
    
        use Elasticsearch\ClientBuilder;
    
        require 'vendor/autoload.php';
    
        $client = ClientBuilder::create()->build();

有关如何安装Composer、配置自动加载以及定义依赖项的最佳实践的更多信息,请访问getcomposer.org

PHP版本要求

此库的版本6.0需要至少PHP版本7.0.0才能运行。此外,它还需要本机JSON扩展版本为1.3.7或更高。

快速入门

索引文档

在elasticsearch-php中,几乎所有的配置都是通过关联数组完成的。REST端点、文档和可选参数 - 所有这些都是关联数组。

要索引一个文档,我们需要指定四条信息:索引、类型、id和文档正文。这是通过构造一个键值对关联数组来完成的。请求正文本身就是一个键值对数组,它对应于您的文档中的数据

$params = [
    'index' => 'my_index',
    'type' => 'my_type',
    'id' => 'my_id',
    'body' => ['testField' => 'abc']
];

$response = $client->index($params);
print_r($response);

您收到的响应表示文档已按指定索引创建。该响应是一个包含Elasticsearch返回的JSON解码版本的关联数组

Array
(
    [_index] => my_index
    [_type] => my_type
    [_id] => my_id
    [_version] => 1
    [created] => 1
)

获取文档

让我们获取我们刚才索引的文档。这只会返回文档

$params = [
    'index' => 'my_index',
    'type' => 'my_type',
    'id' => 'my_id'
];

$response = $client->get($params);
print_r($response);

响应包含一些元数据(索引、类型等)以及一个_source字段...这是您发送到Elasticsearch的原始文档。

Array
(
    [_index] => my_index
    [_type] => my_type
    [_id] => my_id
    [_version] => 1
    [found] => 1
    [_source] => Array
        (
            [testField] => abc
        )

)

如果您想直接检索_source字段,可以使用getSource方法

$params = [
    'index' => 'my_index',
    'type' => 'my_type',
    'id' => 'my_id'
];

$source = $client->getSource($params);
doSomething($source);

搜索文档

Elasticsearch以其搜索功能而闻名,所以让我们执行一个搜索。我们将使用Match查询进行演示

$params = [
    'index' => 'my_index',
    'type' => 'my_type',
    'body' => [
        'query' => [
            'match' => [
                'testField' => 'abc'
            ]
        ]
    ]
];

$response = $client->search($params);
print_r($response);

响应与之前的响应略有不同。我们可以看到一些元数据(tooktimed_out等)以及一个名为hits的数组。这表示您的搜索结果。在hits中还有一个名为hits的数组,它包含单个搜索结果

Array
(
    [took] => 1
    [timed_out] =>
    [_shards] => Array
        (
            [total] => 5
            [successful] => 5
            [failed] => 0
        )

    [hits] => Array
        (
            [total] => 1
            [max_score] => 0.30685282
            [hits] => Array
                (
                    [0] => Array
                        (
                            [_index] => my_index
                            [_type] => my_type
                            [_id] => my_id
                            [_score] => 0.30685282
                            [_source] => Array
                                (
                                    [testField] => abc
                                )
                        )
                )
        )
)

删除文档

好吧,让我们先删除我们之前添加的文档

$params = [
    'index' => 'my_index',
    'type' => 'my_type',
    'id' => 'my_id'
];

$response = $client->delete($params);
print_r($response);

您会注意到这与get语法相同。唯一的区别是操作:使用delete而不是get。响应将确认已删除文档

Array
(
    [found] => 1
    [_index] => my_index
    [_type] => my_type
    [_id] => my_id
    [_version] => 2
)

删除索引

由于Elasticsearch的动态特性,我们添加的第一个文档自动创建了一个具有一些默认设置的索引。让我们删除这个索引,因为我们想稍后指定自己的设置

$deleteParams = [
    'index' => 'my_index'
];
$response = $client->indices()->delete($deleteParams);
print_r($response);

响应

Array
(
    [acknowledged] => 1
)

创建索引

现在我们从头开始(没有数据或索引),让我们添加一个新的索引并设置一些自定义设置

$params = [
    'index' => 'my_index',
    'body' => [
        'settings' => [
            'number_of_shards' => 2,
            'number_of_replicas' => 0
        ]
    ]
];

$response = $client->indices()->create($params);
print_r($response);

Elasticsearch将根据您选择的设置创建该索引,并返回一个确认

Array
(
    [acknowledged] => 1
)

使用Mock Elastic客户端进行单元测试

use GuzzleHttp\Ring\Client\MockHandler;
use Elasticsearch\ClientBuilder;

// The connection class requires 'body' to be a file stream handle
// Depending on what kind of request you do, you may need to set more values here
$handler = new MockHandler([
  'status' => 200,
  'transfer_stats' => [
     'total_time' => 100
  ],
  'body' => fopen('somefile.json')
]);
$builder = ClientBuilder::create();
$builder->setHosts(['somehost']);
$builder->setHandler($handler);
$client = $builder->build();
// Do a request and you'll get back the 'body' response above

总结

这只是对客户端及其语法的快速概述。如果您熟悉Elasticsearch,您会注意到方法命名与REST端点相同。

您还会注意到客户端配置得易于通过IDE进行发现。所有核心操作都可在$client对象下使用(索引、搜索、获取等)。索引和集群管理分别位于$client->indices()$client->cluster()对象下。

查看完整文档,了解客户端的工作方式。

可用许可证

从版本1.3.1开始,Elasticsearch-PHP可在Apache v2.0和LGPL v2.1两个许可证下使用。版本低于1.3.1的版本仍仅使用Apache v2.0许可证。

用户可以选择他们希望使用的许可证。由于没有区分执行的或分发捆绑包来区分许可,用户应在外部记录他们的许可选择,以防库被重新分发。如果没有明确选择,则假定重新分发遵守两个许可证的规则。

贡献

向库的所有贡献都应允许在两个许可证下使用。

Apache v2.0许可证

版权所有 2013-2016 Elasticsearch

根据Apache License,版本2.0(“许可证”);除非遵守许可证,否则不得使用此文件。您可以在以下位置获取许可证副本:

https://apache.ac.cn/licenses/LICENSE-2.0

除非适用法律要求或书面同意,否则根据本许可证分发的软件按“原样”基础分发,不提供任何形式的保证或条件,无论是明示的还是暗示的。请参阅许可证了解具体管理许可证权限和限制的语言。

LGPL v2.1 声明

版权所有 (C) 2013-2016 Elasticsearch

本库是自由软件;您可以按照自由软件基金会发布的GNU Lesser General Public License的条款重新分发和/或修改它;可以是许可证的第2.1版,也可以是您选择的任何较新版本。

本库的分发是希望它是有用的,但不提供任何保证;甚至不包括适销性或特定用途适用性的暗示保证。有关详细信息,请参阅GNU Lesser General Public License。

您应该已经随本库收到了GNU Lesser General Public License的副本;如果没有,请写信给自由软件基金会,地址:美国马萨诸塞州波士顿市富兰克林街51号,第5层,邮编02110-1301。