索引文档
编辑索引文档
编辑当您向 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); }