Производительность

Ниже — реальные замеры на двух разных стендах. Free-версия тестировалась на скромном железе 2014 года, PRO-версия — на современном сервере с эмбеддингами. Все цифры приблизительные и зависят от CPU, RAM, диска и загрузки системы.

Free: поиск без эмбеддингов

Стенд: Mac mini 2014, Linux, 4 CPU, 8 ГБ RAM. Загружено 50 000 тестовых позиций. Цифры взяты из замеров для статьи на Infostart.

ПоказательЗначениеЧто это значит
Точный поиск по id1.85 мс / p95 3.40 мсМгновенный ответ, 1С не заметит задержки
Точный поиск по штрихкоду1.35 мс / p95 1.65 мсЕще быстрее — обычно по индексу
Fuzzy по названию2.35 мс / p95 2.86 мсС учетом опечаток и форм слов
Загрузка 50 000 позиций~39 с~1275 записей/сек
Размер индекса~3.4 МБОчень компактно

Free: QPS поиска по названию на 10 000 товаров

Замер через wrk на стенде AMD Ryzen 7 5700X, 64 ГБ RAM, NVMe SSD. 1000 случайных поисковых фраз из демо-каталога, limit=10, нагрузка: 2 потока, 10 соединений, 30 с.

КонфигурацияQPSСредняя latencyp50p99
Production-конфиг (по умолчанию)~242~41 мс~40 мс~83 мс
Tuned-конфиг (отключены дорогие фичи поиска)~664~15 мс~14 мс~30 мс

Tuned-конфиг дает примерно в 2,7 раза больше QPS за счет отключения дорогих search-time фич. Это максимум throughput; production-конфиг сохраняет более высокое качество поиска.

Что именно изменено в tuned-конфиге и зачем
ПараметрProductionTunedПочему влияет на скорость
max_candidates_for_fuzzy500100Меньше fuzzy-кандидатов — быстрее пост-фильтрация
use_unified_searchtruefalseНет лишнего Boolean OR по exact-полям (code, art, barcode)
transliteration_enabledtruefalseНе генерируются транслитерированные варианты токенов
enable_critical_token_filteringtruefalseОтключен пост-фильтр по «критичным» токенам
extended_search_enabledtruefalseНе ищем по extra-полям (color, material и т.д.)
enable_deep_1c_parsingtruefalseНет препроцессинга 1С-запросов
min_token_match_ratio0.50.0Не отсекаем результаты по минимальному покрытию токенов
candidate_multiplier21Меньше кандидатов на ранжирование
logging.levelinfowarnМеньше логов на каждый запрос
console_enabled / file_enabledtruefalseНет pretty-вывода и записи логов на диск

Побочный эффект: может снизиться recall на опечатках, разных падежах и поиске по атрибутам. Используйте tuned-конфиг только как потолок производительности или для нагрузочных тестов, где важен максимум RPS.

PRO: гибридный поиск с эмбеддингами

20 000 товаров, bge-m3-int8

Стенд: AMD Ryzen 9 7945HX, 16 cores / 32 threads, 92 ГБ RAM. Модель bge-m3-int8 (1024 dim).

ПоказательЗначениеПримечание
Вставка 20 000 товаров3.75 с~5339 записей/сек. Эмбеддинги строятся асинхронно.
Фоновая индексация 20 000 векторов~4 минДва фоновых воркера, batch 100. Скорость вычисления эмбеддингов — главный лимит.
Среднее время поиска3.86 мсГибридный поиск: текст + эмбеддинги
p502.28 мсБольшинство запросов мгновенны
p956.39 мсТяжелые запросы остаются быстрыми
p9962.20 мсХолодный старт / прогрев кэша первых запросов
QPS~2541000 тестовых запросов за 3.94 с

100 000 товаров, bge-m3-int8

Стенд: тот же AMD Ryzen 9 7945HX. Batch 500.

ПоказательЗначение
Вставка 100 000 товаров20.77 с (~4813 записей/сек)
Поиск (warm cache)QPS 1603, avg 0.60 мс, p95 0.74 мс
Поиск (cold cache)QPS 460, avg 2.14 мс, p99 75.5 мс
Размер data/506.87 МБ
Размер полнотекстового индекса37.05 МБ
Размер векторного хранилища415.31 МБ

Ресурсы PRO

Ресурс20k товаров100k товаров
RAM после загрузки + модель~9.2 ГБ~20.2 ГБ
Рост RAM относительно старта~0.5 ГБ~2.3 ГБ
Диск (полнотекстовый индекс + векторное хранилище + очередь)~119 МБ~507 МБ
CPU в поиске~13%~5%

Рекомендуемые настройки фоновой индексации

Параметрbge-m3 (по умолчанию)E5-small (быстрее)
pro.background.worker_count22
pro.background.batch_size100500
pro.background.lance_write_buffer_size5121000
Ожидаемая скорость индексации~69 items/s~195 items/s
Для небольших каталогов (\<1000 товаров): уменьшите `pro.background.lance_write_flush_timeout_ms` до 1000–2000 мс, иначе большой буфер будет ждать таймаута.

Какую модель выбрать?

В PRO-режиме семантический поиск работает через ONNX Runtime. По умолчанию активна модель bge-m3, также из коробки настроена e5. Оба варианта конфигурируются через config.toml: вы указываете путь к model.onnx, размерность вектора и стратегию объединения токенов.

Скорость и размер (100k товаров)

МодельВставка 100kQPSAvg latencyДиск data/Полнотекстовый индексВекторное хранилище
bge-m316.11 с (~6208/s)4562.17 мс506.52 МБ37.05 МБ415.23 МБ
e5-small25.02 с (~3997/s)8391.16 мс241.98 МБ37.04 МБ152.99 МБ

Точность (synthetic dataset, 1500 товаров, 120 запросов)

МодельstrategyHit Rate@1Hit Rate@5MRR
bge-m3embedding_only65.83%77.50%0.7156
e5-smallembedding_only36.67%58.33%0.4699
bge-m3hybrid74.17%88.33%0.7994
e5-smallhybrid61.67%80.83%0.7079
Выбирайте bge-m3, если:
  • важна высокая точность семантического поиска;
  • в каталоге много синонимов и опечаток;
  • нужна многоязычность (русский + английский + артикулы);
  • ресурсы сервера позволяют — 20+ ГБ RAM и SSD.
Выбирайте e5-small, если:
  • основной режим — hybrid с сильным полнотекстовым сигналом;
  • критичны скорость индексации и размер диска;
  • запросы в основном точные или содержат артикулы/штрихкоды;
  • сервер ограничен по RAM.
Про разреженные векторы: для `bge-m3` есть поддержка sparse-векторов (параметр `enable_sparse`). В наших тестах подключение sparse-ветки не дало прироста точности в hybrid-режиме, поэтому по умолчанию она выключена.
Как это читать: HTTP-ответ на `/add` остается мгновенным (\~0.1 мс на товар), потому что эмбеддинги строятся в фоновой очереди. Основное время загрузки большого каталога — именно фоновая индексация векторов.