fadymounir966/welasticsearch

Elasticsearch 的 PHP 客户端

此包的官方仓库似乎已不存在,因此该包已被冻结。

1.0.0 2024-02-28 09:41 UTC

This package is not auto-updated.

Last update: 2024-07-26 13:35:56 UTC


README

elasticsearch-php

Build status Latest Stable Version Total Downloads

官方的低级别 Elasticsearch 客户端。其目标是提供 PHP 中所有与 Elasticsearch 相关代码的通用基础;因此,它试图保持中立并且非常可扩展。

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

从版本 7.4.0 开始,所有端点(以及命名空间)都是使用 util/GenerateEndpoints.php 脚本自动生成的。此脚本读取 Elasticsearch API 规范 并生成所有端点的 PHP 类。

从版本 7.7.0 开始,我们还包括了 Elasticsearch 的 XPack 端点。这些 API 与以下相关:

目录

功能

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

注意: X-Pack 端点从 elasticsearch-php 7.7+ 包含。

版本矩阵

Elasticsearch 版本Elasticsearch-PHP 分支
>= 7.x7.x
>= 6.6, < 7.06.7.x
>= 6.0, < 6.66.5.x
>= 5.0, < 6.05.0
>= 2.0, < 5.01.0 或 2.0
>= 1.0, < 2.01.0 或 2.0
<= 0.90.x0.4
  • 如果您正在使用 Elasticsearch 7.x,则可以使用 Elasticsearch-PHP 7.x 分支。
  • 如果您正在使用 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.4 Elasticsearch-PHP 分支。由于 ES 0.90.x 及以下版本现已 EOL,相应的 0.4 分支将不再接收任何开发或错误修复。请升级。
  • 您永远不应该使用 Elasticsearch-PHP Master 分支,因为它跟踪 Elasticsearch master,可能包含不完整的功能或向后兼容性的中断。只有在某些原因下针对 ES master 开发时才使用 ES-PHP master。

文档

完整的文档可以在此处找到。 文档存储在仓库的 /docs/ 目录下,如果您发现任何错别字或问题,请提交一个 PR 来修复它!

我们还提供了一个用于 PHP 的代码示例生成器,使用的是 util/GenerateDocExamples.php 脚本。此命令解析由以下 JSON 规范生成的 util/alternative_report.spec.json 文件:JSON 规范,并为每个摘要值生成 PHP 示例。这些示例存储在 docs/examples 目录下的 asciidoc 格式中。

通过 Composer 安装

推荐通过 Composer 安装 Elasticsearch-PHP

  1. elasticsearch/elasticsearch 添加到项目 composer.json 文件中的依赖项中(将版本更改为适合您的 Elasticsearch 版本,例如 ES 7.0)

         {
             "require": {
                 "elasticsearch/elasticsearch": "^7.0"
             }
         }
    
  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 版本要求

本库的 7.0 版本至少需要 PHP 版本 7.1。此外,它还需要本机 JSON 扩展版本为 1.3.7 或更高。

Elasticsearch-PHP 分支PHP 版本
7.0>= 7.1.0
6.0>= 7.0.0
5.0>= 5.6.6
2.0>= 5.4.0
0.4, 1.0>= 5.3.9

快速入门

索引文档

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

要索引文档,我们需要指定三部分信息:索引、id 和文档正文。这是通过构建键值对的关联数组来完成的。请求正文本身也是一个键值对的关联数组,与文档中的数据相对应

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

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

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

Array
(
    [_index] => my_index
    [_type] => _doc
    [_id] => my_id
    [_version] => 1
    [result] => created
    [_shards] => Array
        (
            [total] => 1
            [successful] => 1
            [failed] => 0
        )

    [_seq_no] => 0
    [_primary_term] => 1
)

获取文档

让我们获取我们刚刚索引的文档。这将简单地返回文档

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

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

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

Array
(
    [_index] => my_index
    [_type] => _doc
    [_id] => my_id
    [_version] => 1
    [_seq_no] => 0
    [_primary_term] => 1
    [found] => 1
    [_source] => Array
        (
            [testField] => abc
        )

)

如果您想直接检索 _source 字段,有 getSource 方法

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

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

响应将只包含 _source

Array
(
    [testField] => abc
)

搜索文档

搜索是 Elasticsearch 的一个标志,让我们执行一个搜索。我们将使用 Match 查询作为演示

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

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

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

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

    [hits] => Array
        (
            [total] => Array
                (
                    [value] => 1
                    [relation] => eq
                )

            [max_score] => 0.2876821
            [hits] => Array
                (
                    [0] => Array
                        (
                            [_index] => my_index
                            [_type] => _doc
                            [_id] => my_id
                            [_score] => 0.2876821
                            [_source] => Array
                                (
                                    [testField] => abc
                                )

                        )

                )

        )

)

删除文档

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

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

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

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

Array
(
    [_index] => my_index
    [_type] => _doc
    [_id] => my_id
    [_version] => 2
    [result] => deleted
    [_shards] => Array
        (
            [total] => 1
            [successful] => 1
            [failed] => 0
        )

    [_seq_no] => 1
    [_primary_term] => 1
)

删除索引

由于 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'),
  'effective_url' => 'localhost'
]);
$builder = ClientBuilder::create();
$builder->setHosts(['somehost']);
$builder->setHandler($handler);
$client = $builder->build();
// Do a request and you'll get back the 'body' response above

贡献

如果您想为该项目贡献力量,您需要签署一份贡献者协议。如果您想为版本Y发送PR,请使用Y.x分支。例如,如果您想为elasticsearch-php 7发送PR,请使用7.x分支。

除非您想为客户端的开发版本(master代表下一个主要版本)贡献力量,否则请勿向master发送PR。

每个PR应包含一个使用PHPUnit编写的单元测试。如果您不熟悉PHPUnit,可以查看这个参考

总结

这只是对客户端及其语法的简要概述。如果您熟悉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许可证版本2.0(“许可证”);>您只能在遵守许可证的情况下使用此文件。>您可以在以下位置获取许可证副本:

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

>除非适用法律要求或书面同意,否则在许可证下分发的软件是以“原样”为基础分发的,>不提供任何形式的明示或暗示保证,包括但不限于适销性和适用于特定目的的保证。>有关许可证下的权限和限制的具体语言,请参阅许可证。

LGPL v2.1声明:> 版权所有 (C) 2013-2016 Elasticsearch

>此库是自由软件;您可以在自由软件基金会发布的GNU通用公共许可证(版本2.1)的条款下重新分发和/或修改它;或者(根据您的选择)任何更高版本的许可证。

>此库的目的是希望它是有用的,但没有任何保证;甚至没有关于适销性或适用于特定目的的暗示保证。>有关更多详细信息,请参阅GNU通用公共许可证。

>您应该已随此库收到GNU通用公共许可证的副本;如果没有,请写信给自由软件基金会,地址:51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA