连接

编辑

本页包含您连接和使用客户端与 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(请参见屏幕截图中的红色矩形)。

Elastic Cloud ID

您可以在 管理 页面的 安全 部分下生成 API 密钥

Create API key

当您点击 创建 API 密钥 按钮时,您可以选择一个名称并设置其他选项(例如,限制权限、过期时间等)。

Choose an API name

完成此步骤后,您将在 API 密钥页面中获取 `API 密钥`。

Cloud API key

重要:您需要复制 `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 ResponseInterfaceArrayAccessElastic\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());

此处的响应与之前的响应不同。您可以看到元数据(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] => _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
)