Оптимизация переиндексации Elasticsearch для 1С-Битрикс
На одном из проектов с каталогом 800 000 SKU полная переиндексация Elasticsearch из 1С-Битрикс занимала 14 часов. За это время накапливалась очередь изменений, поиск отдавал устаревшие данные, а импорт из 1С конкурировал с индексацией за ресурсы сервера. Более того, в процессе индексации при каждом refresh поиск блокировался на доли секунды, что для интернет-магазина с пиковой нагрузкой до 10 000 запросов в минуту приводило к задержкам до 3 секунд. Наша задача — сократить полную переиндексацию до 1–2 часов без единой секунды простоя поиска. Опыт работы с каталогами до 2 млн товаров позволяет гарантировать такой результат. Подобная ситуация знакома многим: чем больше каталог, тем медленнее стандартные механизмы. Но решение лежит на поверхности — правильная настройка Elasticsearch и оптимизация кода индексатора.
Почему переиндексация тормозит?
Типичные причины медленной индексации — последовательная отправка каждого документа отдельным PUT-запросом, принудительный refresh после каждого пакета и дефолтный refresh_interval в 1 секунду. Каждый refresh создаёт новый сегмент Lucene, который затем приходится объединять. На каталоге в 800k SKU это генерирует сотни тысяч мелких сегментов, и Elasticsearch тратит ресурсы на их слияние.
Стратегия zero-downtime переиндексации
Ключевой приём — индексировать в новый индекс, а не поверх рабочего. Текущий индекс bitrix_catalog_v1 обслуживает поиск через алиас bitrix_catalog. Параллельно мы строим bitrix_catalog_v2. После завершения переиндексации атомарно переключаем алиас — поиск переходит на новый индекс без прерывания.
Какие настройки Elasticsearch ускоряют индексацию?
Перед массовой индексацией временно меняем параметры:
PUT /bitrix_catalog_v2/_settings
{
"index": {
"refresh_interval": "-1",
"number_of_replicas": 0,
"translog.durability": "async",
"translog.sync_interval": "30s"
}
}
Отключение refresh (-1) ускоряет индексацию в 3–5 раз, так как документы не попадают в поиск до явного вызова. Отключение реплик (number_of_replicas: 0) снижает нагрузку на кластер. Асинхронный транслог сбрасывается на диск каждые 30 секунд, а не при каждой операции. После индексации восстанавливаем стандартные настройки и выполняем forcemerge для объединения сегментов в один.
Как оптимизировать PHP-индексатор?
Используем Bulk API с пакетами по 500 документов (5–15 МБ). Это в 10–20 раз быстрее, чем одиночные запросы. Elasticsearch Bulk API — стандартная практика для массовой загрузки.
$batchSize = 500;
$bulk = [];
foreach ($products as $product) {
$bulk[] = ['index' => ['_index' => 'bitrix_catalog_v2', '_id' => $product['ID']]];
$bulk[] = buildDocument($product);
if (count($bulk) >= $batchSize * 2) {
$client->bulk(['body' => $bulk]);
$bulk = [];
}
}
if (!empty($bulk)) {
$client->bulk(['body' => $bulk]);
}
Параллельная индексация через несколько процессов — делим каталог по диапазонам ID. Три процесса на трёхнодовом кластере дают линейное ускорение. Ограничение — скорость чтения из MySQL.
Что даёт параллельная индексация?
Использование bulk API и параллельной индексации ускоряет индексацию в 10–20 раз по сравнению с последовательными одиночными запросами. На нашем проекте полная переиндексация сократилась с 14 часов до 1 часа 20 минут.
Переключение алиаса
После индексации атомарно переключаем алиас:
POST /_aliases
{
"actions": [
{ "remove": { "index": "bitrix_catalog_v1", "alias": "bitrix_catalog" } },
{ "add": { "index": "bitrix_catalog_v2", "alias": "bitrix_catalog" } }
]
}
Операция занимает миллисекунды, поиск не прерывается.
Пример полного сценария переиндексации
- Создать новый индекс с оптимизированными настройками.
- Настроить алиас на текущий индекс.
- Запустить параллельные процессы индексации с bulk API.
- После завершения переключить алиас на новый индекс.
- Восстановить настройки (refresh_interval, реплики) и выполнить forcemerge.
Сравнение до и после оптимизации
| Параметр | До оптимизации | После оптимизации |
|---|---|---|
| Полная переиндексация (800k SKU) | 14 часов | 1 ч 20 мин |
| Инкрементальное обновление | 15–20 док/с | 200–300 док/с |
| Простой поиска | Да | Нет |
Что входит в услугу
- Аудит текущей конфигурации Elasticsearch и PHP-индексатора
- Настройка индексов и mapping под типовые запросы
- Оптимизация bulk API и параллельной обработки
- Реализация zero-downtime с алиасами
- Документация по эксплуатации
- Консультация и обучение вашей команды
Стоимость услуги рассчитывается индивидуально после аудита. Мы дадим точную оценку в течение 2 рабочих дней.
Как мы гарантируем результат?
Наш опыт — более 10 лет разработки на Битрикс, более 50 внедрений поиска для каталогов с товарами от 10k до 2M SKU. Для каждого проекта проводим нагрузочное тестирование и даём гарантию на скорость индексации. Elasticsearch — де-факто стандарт для высоконагруженных каталогов. Свяжитесь с нами для оценки вашего проекта — мы подготовим план оптимизации. Закажите услугу оптимизации и получите ускорение индексации в 7+ раз.
Сколько времени занимает оптимизация?
Обычно от 3 до 10 рабочих дней в зависимости от сложности каталога и текущих настроек. Точные сроки определяем после аудита. Экономия ресурсов сервера и снижение затрат на инфраструктуру окупают вложения в течение нескольких месяцев.







