索引文档

编辑

当您向 Elasticsearch 添加文档时,您需要索引 JSON 文档。这自然映射到 PHP 关联数组,因为它们可以轻松地编码为 JSON。因此,在 Elasticsearch-PHP 中,您可以创建并传递关联数组到客户端进行索引。这里介绍了几种将数据导入 Elasticsearch 的方法。

单个文档索引

编辑

索引文档时,您可以提供 ID 或让 Elasticsearch 为您生成一个 ID。


提供 ID 值。

$params = [
    'index' => 'my_index',
    'id'    => 'my_id',
    'body'  => [ 'testField' => 'abc']
];

// Document will be indexed to my_index/_doc/my_id
$response = $client->index($params);


省略 ID 值。

$params = [
    'index' => 'my_index',
    'body'  => [ 'testField' => 'abc']
];

// Document will be indexed to my_index/_doc/<autogenerated ID>
$response = $client->index($params);


如果您需要设置其他参数,例如 routing 值,则可以在包含 index 等其他参数的数组中指定这些参数。例如,让我们设置此新文档的路由和时间戳

其他参数。

$params = [
    'index'     => 'my_index',
    'id'        => 'my_id',
    'routing'   => 'company_xyz',
    'timestamp' => strtotime("-1d"),
    'body'      => [ 'testField' => 'abc']
];


$response = $client->index($params);


批量索引

编辑

Elasticsearch 还支持文档的批量索引。批量 API 期望 JSON 操作/元数据对,并以换行符分隔。在 PHP 中构建文档时,过程类似。首先创建一个操作数组对象(例如,index 对象),然后创建一个文档主体对象。此过程对所有文档重复。

一个简单的示例如下所示

使用 PHP 数组进行批量索引。

for($i = 0; $i < 100; $i++) {
    $params['body'][] = [
        'index' => [
            '_index' => 'my_index',
	    ]
    ];

    $params['body'][] = [
        'my_field'     => 'my_value',
        'second_field' => 'some more values'
    ];
}

$responses = $client->bulk($params);

在实践中,您可能拥有比您希望在单个批量请求中发送的更多的文档。在这种情况下,您需要将请求分批并定期发送它们

批量索引与批处理。

$params = ['body' => []];

for ($i = 1; $i <= 1234567; $i++) {
    $params['body'][] = [
        'index' => [
            '_index' => 'my_index',
            '_id'    => $i
        ]
    ];

    $params['body'][] = [
        'my_field'     => 'my_value',
        'second_field' => 'some more values'
    ];

    // Every 1000 documents stop and send the bulk request
    if ($i % 1000 == 0) {
        $responses = $client->bulk($params);

        // erase the old bulk request
        $params = ['body' => []];

        // unset the bulk response when you are done to save memory
        unset($responses);
    }
}

// Send the last batch if it exists
if (!empty($params['body'])) {
    $responses = $client->bulk($params);
}