Как правильно проиндексировать большой объем информации в elasticsearch
Создал команду в Laravel, в ней получаю все товары
$prod = Prod::cursor();
Перебираю и записываю в elasticsearch
$this->elasticsearch->index([
'index' => 'prods',
'type' => 'prod',
'id' => $prod->prods_id,
'body' => [
'site_id' => $prod->site_id,
'category_id' => $prod->category_id,
'fields' => $prod->field,
'priority' => $prod->priority,
'prod_updated_at' => $prod->updated_at_p,
'prod_created_at' => $prod->created_at_p,
'site_rating' => $prod->site_rating,
'prod_rating' => $prod->prod_rating,
],
]);
Записей в БД более 2 миллионов
В среднем в elasticsearch записывается 23 000 товаров в час, это получается, что для записи все БД потребуется где-то 4 дня
Возможно ли записать более быстрым способом?
Ответы (1 шт):
Автор решения: Aleksey V
→ Ссылка
Используй bulk()
/*** Массовое добавление данных в индекс ***/
public function indexMany(object $collection)
{
$parameters = [];
foreach ($collection as $item) {
$parameters['body'][] = [
"index" => [
'_id' => $item->uuid,
'_index' => 'parser_parts',
//'_type' => $item['type'],
]
];
$parameters['body'][] = [
'id' => $item->id,
'uuid' => $item->uuid,
'name' => $item->name,
];
}
return $this->client->bulk($parameters);
}