连接编辑

本页面包含连接和使用 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(请参阅屏幕截图中报告的红色矩形)。

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 启动期间复制的 密码 后,我们可以使用它连接到 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 的信息。$responseElastic\Elasticsearch\Response\Elasticsearch 类的对象,该类实现了 ElasticsearchInterface、PSR-7 ResponseInterfaceArrayAccess

这意味着 $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 ResponseInterfaceArrayAccess。这意味着您可以像访问关联数组一样访问响应主体,如下所示

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
)