商品 / Elasticsearch
Elasticsearch 的 PHP 客户端
Requires
- php: ^5.6|^7.0
- guzzlehttp/ringphp: ~1.0
- psr/log: ~1.0
Requires (Dev)
- cpliakas/git-wrapper: ~1.0
- doctrine/inflector: ^1.1
- mockery/mockery: 0.9.4
- phpunit/phpunit: ^4.7|^5.4
- sami/sami: ~3.2
- symfony/finder: ^2.8
- symfony/yaml: ^2.8
Suggests
- ext-curl: *
- monolog/monolog: Allows for client-level logging and tracing
README
官方低级客户端,旨在为所有 PHP 相关的 Elasticsearch 代码提供共同基础;因此它试图保持中立且易于扩展。
为了在整个低级客户端(Ruby、Python 等)之间保持一致性,客户端接受简单的关联数组作为参数。所有参数,从 URI 到文档体,都在关联数组中定义。
功能
- 与 REST API 和其他语言客户端一对一映射
- 可配置的、自动发现集群节点
- 持久连接(在脚本的生命周期内),Keep-Alive
- 所有可用节点之间的负载均衡(带有可插拔的选择策略)。默认为轮询
- 可插拔的连接池,提供不同的连接策略
- 通用、可插拔的架构 - 大多数组件都可以用自定义类替换,以实现特定行为
- 异步 future 选项,允许并行执行多个节点的 curl 请求
版本矩阵
- 如果你使用 Elasticsearch 5.0+,请使用 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 及以下版本现已过时,相应的0.4
分支将不再接收任何开发或错误修复。请升级。 - 你永远不应该使用 Elasticsearch-PHP Master 分支,因为它跟踪 Elasticearch master,可能包含不完整的功能或向后兼容性中断。只有在你有特定原因针对 ES master 开发时才使用 ES-PHP master。
文档
完整文档可在此处找到。 文档存储在存储库的 /docs/ 目录下,因此如果您发现错别字或问题,请提交 PR 以修复它!
通过 Composer 安装
安装 Elasticsearch-PHP 的推荐方法是使用 Composer。
-
将
elasticsearch/elasticsearch
添加到项目composer.json
文件中的依赖项(根据 Elasticsearch 的版本更改版本){ "require": { "elasticsearch/elasticsearch": "~5.0" } }
-
下载并安装 Composer
curl -s http://getcomposer.org/installer | php
-
安装依赖项
php composer.phar install
-
需要 Composer 的自动加载器
Composer 还准备了一个自动加载文件,可以自动加载它下载的任何库中的所有类。要使用它,只需将以下行添加到代码的引导过程中
<?php use Elasticsearch\ClientBuilder; require 'vendor/autoload.php'; $client = ClientBuilder::create()->build();
有关如何安装 Composer、配置自动加载以及定义依赖项的最佳实践,请参阅 getcomposer.org。
PHP 版本要求
此库的版本 5.0 至少需要 PHP 版本 5.6.6 才能运行。此外,它需要本机 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);
与之前的响应相比,响应略有不同。我们看到一些元数据(took
、timed_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 Client进行单元测试
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号,第五层,邮编02110-1301。