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