索引文档
编辑索引文档编辑
当您将文档添加到 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); }