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

Возможно ли записать более быстрым способом?
  • Вопрос задан
  • 330 просмотров
Пригласить эксперта
Ответы на вопрос 3
2ord
@2ord
Хотя с ES мало работал и мне показалось странным, что индекс нужно строить по такому количеству полей. Какой в этом практический смысл? Почему не хранить в ES лишь то, что требуется искать и/или анализировать? Ведь для остальных случаев можно использовать реляционную СУБД.
Маш. перевод про индексы и мощность
Ответ написан
@Flying
Используйте Bulk API, через него загрузка в десятки раз быстрее чем по одному документу заливать.

Правда закидывать всё одним bulk'ом тоже не стоит, практика показывает что пакеты порядка сотни документов за раз - вполне, хотя от размеров одного документа тоже зависит.
Ответ написан
Комментировать
@vitaly_il1
DevOps Consulting
Записей в БД более 2 миллионов
В среднем в elasticsearch записывается 23 000 товаров в час, это получается, что для записи все БД потребуется где-то 4 дня


У меня два вопроса, один из которых слегка офф-топик
1) на каком сервере это бежит и что показывает top?
2)  а чем вас не устраивает 4 дня на первичное заполнение базы? Дальше-то будете добавлять только новые записи?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы