索引文档

编辑

当你向 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);
}