连接
编辑连接编辑
本页面包含连接和使用 Elasticsearch 客户端所需的信息。
本页内容
Elastic Cloud编辑
您可以使用 API 密钥 和 Cloud ID 连接到 Elastic Cloud
$client = ClientBuilder::create() ->setElasticCloudId('<cloud-id>') ->setApiKey('<api-key>') ->build();
其中 <cloud-id> 和 <api-key> 可以使用 Elastic Cloud Web UI 检索。
您可以从仪表板的 我的部署
页面获取 Cloud ID
(请参阅屏幕截图中报告的红色矩形)。
您可以在 管理
页面 安全
部分下生成 API 密钥
。
单击 创建 API 密钥
按钮时,您可以选择一个名称并设置其他选项(例如,限制权限、过期时间等)。
完成此步骤后,您将在 API 密钥页面中获得 `API 密钥`。
重要提示:您需要将 `API 密钥` 复制并存储在安全的地方,因为您将无法在 Elastic Cloud 中再次查看它。
默认安全设置 (HTTPS)编辑
Elasticsearch 8.0 提供 默认安全设置,这意味着它使用 TLS 来保护客户端和服务器之间的通信。
为了配置 elasticsearch-php
以连接到 Elasticsearch 8.0,我们需要拥有证书颁发机构文件 (CA)。
您可以通过不同方式安装 Elasticsearch,例如,使用 Docker,您需要执行以下命令
docker pull docker.elastic.co/elasticsearch/elasticsearch:8.0.1
安装 Docker 镜像后,您可以执行 Elasticsearch,例如使用单节点集群配置,如下所示
docker network create elastic docker run --name es01 --net elastic -p 9200:9200 -p 9300:9300 -it docker.elastic.co/elasticsearch/elasticsearch:8.0.1
此命令创建一个 elastic
Docker 网络,并使用端口 9200
(默认)启动 Elasticsearch。
运行 Docker 镜像时,会为 elastic
用户生成一个密码,并将其打印到终端(您可能需要在终端中向上滚动才能看到它)。您必须复制它,因为我们需要连接到 Elasticsearch。
现在 Elasticsearch 正在运行,我们可以获取 http_ca.crt
文件证书。我们需要使用以下命令从 Docker 实例中复制它
docker cp es01:/usr/share/elasticsearch/config/certs/http_ca.crt .
获得 http_ca.crt
证书和在 Elasticsearch 启动期间复制的 密码
后,我们可以使用它连接到 elasticsearch-php
,如下所示
$client = ClientBuilder::create() ->setHosts(['https://127.0.0.1:9200']) ->setBasicAuthentication('elastic', 'password copied during Elasticsearch start') ->setCABundle('path/to/http_ca.crt') ->build();
有关 Elasticsearch Docker 配置的更多信息,请阅读 此处 的官方文档。
用法编辑
本节是对客户端及其语法的速成课程概述。如果您熟悉 Elasticsearch,您会注意到这些方法的命名方式与 REST 端点相同。
您可能还会注意到,客户端的配置方式便于通过 IDE 轻松发现。所有核心操作都可以在 $client
对象下使用(索引、搜索、获取等)。索引和集群管理分别位于 $client->indices()
和 $client->cluster()
对象下。
信息 API编辑
您可以使用 info()
API 获取有关 Elasticsearch 实例的信息,如下所示
$response = $client->info();
您获得的响应包含有关 Elasticsearch 的信息。$response
是 Elastic\Elasticsearch\Response\Elasticsearch
类的对象,该类实现了 ElasticsearchInterface
、PSR-7 ResponseInterface 和 ArrayAccess。
这意味着 $response
是一个 PSR-7 对象
echo $response->getStatusCode(); // 200 echo (string) $response->getBody(); // Response body in JSON
也是一个“数组”,这意味着您可以像访问关联数组一样访问响应主体,如下所示
echo $response['version']['number']; // 8.0.0 var_dump($response->asArray()); // response body content as array
此外,您还可以将响应主体作为对象、字符串或布尔值进行访问
echo $response->version->number; // 8.0.0 var_dump($response->asObject()); // response body content as object var_dump($response->asString()); // response body as string (JSON) var_dump($response->asBool()); // true if HTTP response code between 200 and 300
索引文档编辑
要索引文档,我们需要指定三条信息:索引、ID 和文档主体。这是通过构造一个键值对的关联数组来完成的。请求主体本身就是一个关联数组,其键值对对应于文档中的数据
$params = [ 'index' => 'my_index', 'id' => 'my_id', 'body' => ['testField' => 'abc'] ]; $response = $client->index($params); print_r($response->asArray());
您获得的响应表明文档已在您指定的索引中创建。$response
是一个 Elastic\Elasticsearch\Response\Elasticsearch
类的对象,该类实现了 ElasticsearchInterface
、PSR-7 ResponseInterface 和 ArrayAccess。这意味着您可以像访问关联数组一样访问响应主体,如下所示
Array ( [_index] => my_index [_type] => _doc [_id] => my_id [_version] => 1 [created] => 1 )
将主体设置为 JSON 字符串编辑
如果需要,您可以将 `body` 参数指定为 JSON 字符串。这对于测试(例如,从在线代码示例中复制和粘贴)或如果您已经有一些要存储在 Elasticsearch 中的 JSON 文档时非常有用。
例如,前面的索引示例可以改写如下
$params = [ 'index' => 'my_index', 'id' => 'my_id', 'body' => '{"testField" : "abc"}' ]; $response = $client->index($params); print_r($response->asArray());
获取文档编辑
让我们获取我们刚刚索引的文档。这将返回文档
$params = [ 'index' => 'my_index', 'id' => 'my_id' ]; $response = $client->get($params); print_r($response->asArray());
响应包含元数据(例如索引、版本等)以及 _source
字段,该字段是您发送到 Elasticsearch 的原始文档。
Array ( [_index] => my_index [_type] => _doc [_id] => my_id [_version] => 1 [found] => 1 [_source] => Array ( [testField] => abc ) )
搜索文档编辑
搜索是 Elasticsearch 的一个标志性功能,所以让我们执行一次搜索。我们将使用 match
查询作为演示
$params = [ 'index' => 'my_index', 'body' => [ 'query' => [ 'match' => [ 'testField' => 'abc' ] ] ] ]; $response = $client->search($params); print_r($response->asArray());
这里的响应与之前的不同。您可以看到元数据(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] => _doc [_id] => my_id [_score] => 0.30685282 [_source] => Array ( [testField] => abc ) ) ) ) )
删除文档编辑
好的,让我们继续删除之前添加的文档
$params = [ 'index' => 'my_index', 'id' => 'my_id' ]; $response = $client->delete($params); print_r($response->asArray());
此语法与 get
语法相同。唯一的区别是操作:delete
而不是 get
。响应确认文档已删除
Array ( [found] => 1 [_index] => my_index [_type] => _doc [_id] => my_id [_version] => 2 )
删除索引编辑
由于 Elasticsearch 的动态特性,您添加的第一个文档会自动构建一个具有一些默认设置的索引。删除该索引并在以后指定您自己的设置
$deleteParams = [ 'index' => 'my_index' ]; $response = $client->indices()->delete($deleteParams); print_r($response->asArray());
响应
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->asArray());
Elasticsearch 现在使用您选择的设置创建该索引,并返回确认
Array ( [acknowledged] => 1 )