连接
编辑连接
编辑本页包含您连接和使用客户端与 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 获取。
您可以从仪表板的 My deployment
页面获取 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 启动期间复制的 password
,我们就可以使用它来连接 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()
对象下。
Info API
编辑您可以使用 info()
API 获取有关 Elasticsearch 实例的信息,如下所示
$response = $client->info();
您收到的响应包含有关 Elasticsearch 的信息。$response
是实现 ElasticsearchInterface
、PSR-7 ResponseInterface 和 ArrayAccess 的 Elastic\Elasticsearch\Response\Elasticsearch
类的对象。
这意味着 $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());
您收到的响应表明该文档已在您指定的索引中创建。可以使用 asArray()
函数将响应呈现为关联数组。数组响应包含 Elasticsearch 返回的 JSON 的解码版本
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 )