Как правильно проиндексировать большой объем информации в 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);
    }

→ Ссылка