Конфигурация
config.toml, в котором большинство параметров уже заполнены разумными значениями. Вы можете запустить сервис «из коробки» или изменить конфигурацию под свои задачи.
service/config.toml все обязательные поля уже заполнены. Для остальных параметров, если в конфиге значение не задано, используется встроенное значение по умолчанию, указанное на этой странице.
[pro]; PRO-версия включает ее принудительно. Значение pro.enabled в config.toml игнорируется.
config.toml. Параметры без встроенного значения по умолчанию обязательны и должны быть указаны в конфиге.
[csv] — Параметры CSV-импорта
sku-cli import при запуске с флагом --config config.toml, если не переопределен явно через --delimiter.
- Обычно
","или";" - Применяется только в CLI; сам сервис CSV не парсит
[server] — Сетевые параметры
- Локальная разработка:
"127.0.0.1:8080" - Production / Docker:
"0.0.0.0:8080" - IPv6:
"[::1]:8080"
"Slow request". Полноценный HTTP-таймаут с возвратом 504 Gateway Timeout в текущей версии не реализован.
- Пакетная загрузка (до 500 элементов): 3000-5000 мс
- Интерактивный поиск: 1000-2000 мс
- Рекомендуется: 100-300 для 1С, до 500 для фоновой синхронизации, 1 000-5 000 для массовой первичной загрузки при мощном CPU/SSD.
- При превышении вернется 400 Bad Request.
- Защита от перегрузки CPU и RAM.
- Большой batch требует большего
max_request_body_size_mbи соответствующегоclient_max_body_sizeв nginx. Подробные замеры и рекомендации — в разделе Производительность массовой загрузки.
- Влияет на лимит тела, который накладывает Axum до разбора JSON
- Должен быть достаточен для
max_batch_sizeс самыми длинными полями (name,supplier, описания и т.п.) - При превышении вернется 413 Request Entity Too Large
- nginx (или другой reverse proxy) должен иметь не меньший
client_max_body_size
[site] — Режим работы "Только для сайта" (API Gateway / Frontend Proxy)
enabled = true и readonly = true. Остаются только чтение: /find, /export, /health, /api/search-config и статика.
enabled. Когда enabled = true и readonly = true, все мутации отключены. При enabled = false значение readonly не влияет на доступность мутаций.
[license] — Лицензирование PRO
[index] — Полнотекстовый индекс
- Создается автоматически при старте
- Размещайте на быстром SSD (NVMe предпочтительно)
- Не используйте NFS, SMB — резкое падение производительности
- < 100 000 записей: 50-100 МБ
- 100 000-500 000: 150-250 МБ
- > 500 000: 300-500 МБ
- Больше = реже диск I/O, быстрее массовая загрузка
[pro.index].writer_ram_budget_mb. Если [pro.index].writer_ram_budget_mb = 0 (default), используется верхнеуровневый параметр [index].writer_ram_budget_mb.
0: только точные совпадения (макс. скорость)1: одна опечатка (рекомендуется для production)2: две опечатки (+10-15% recall, но в 1.5-2 раза медленнее)
fuzzy_max_distance. С типовым значением 1 поиск хорошо ловит отдельные опечатки («блот» → «болт»), но может пропускать разные падежные формы («болтом», «болты»), потому что после стемминга они дают один и тот же корень, а расстояние Левенштейна между исходными формами бывает равно 2.Если в вашей предметной области важен поиск в разных падежах (например, пользователи вводят «стальным болтом» вместо «стальной болт»), установите
fuzzy_max_distance = 2. В наших замерах скорость при этом остается в диапазоне 15–20 мс на 50 000 товаров.
false(по умолчанию): сервис не запустится и сообщит об ошибкеSchemaError. Используйте, если потеря индекса недопустима.true: старый индекс переименовывается в./data/index.bak.<timestamp>, создается новый пустой индекс. Сервис продолжит работу, но данные нужно будет загрузить заново.
[search] — Алгоритмы предобработки и фильтрации
[search.field_weights] — Веса базовых полей
1: включает однобуквенные коды ("М", "А", "Б"), но добавляет шум2: оптимально для номенклатуры (отсекает предлоги, частицы)3: максимальная скорость, если нет значимых коротких кодов
- Критично для точности BM25 и скорости
- Отсекает высокочастотные слова: "упак", "кор", "ящ", "комплект", "набор"
- Рекомендуется:
true
- Загружается при старте. Если не найден — используется встроенный набор
- Добавляйте отраслевой шум: "упак", "кор", "ящ", "комплект", "набор"
- Финальный порог вычисляется как
max(relative_threshold, max_score × auto_match_threshold), т.е. результат должен быть не хуже доли от максимального скора - Рекомендуется: 0.85-0.90 для баланса точности/полноты
- Много ложных срабатываний → увеличьте до 0.92
- Ничего не находится → снизьте до 0.75-0.80
true: оператор может ввести "болт м16 78454" в одно поле — найдетсяfalse: поиск только по полюname(быстрее, но менее гибко)- Рекомендуется:
trueдля интеграции с 1С/Excel
"ghbdtn"→"привет"- Экспериментальная функция, может давать ложные срабатывания
- Включайте, если пользователи часто забывают переключить раскладку
Результаты с score < (max_score × relative_score_threshold) отфильтровываются.
0.50: мягкая фильтрация (default, оставляет 50% от лучшего)0.55: баланс точности/полноты (рекомендуется для production)0.60-0.70: агрессивно, только очень релевантные
max(relative_threshold, max_score × auto_match_threshold). Результат должен превышать оба значения.
Критичные токены — короткие (≤ critical_token_max_length) ИЛИ содержащие цифры.
Захватывает: М16, 42р, XL, 220V, IP67, DIN125 и т.д.
- Включите для "грязных" баз, где важно точное совпадение по коротким кодам
- Отключите, если короткие коды встречаются в каждом товаре (теряете полноту)
- М16 (3 символа) — критичный при значении 4
- DIN125 (5 символов) — НЕ критичный при значении 4
- Увеличьте до 5, если у вас есть значимые 5-символьные коды (DIN125, ГОСТ7798)
Доля токенов запроса, которые должны совпасть в результате.
0.5: минимум 50% токенов должны совпасть (рекомендуется)0.7: строже, 70% токенов (меньше ложных срабатываний)0.0: отключить фильтрацию (старое поведение)
- Больше → выше точность, но медленнее
- Меньше → быстрее, но можно пропустить релевантные результаты
- Рекомендуемый диапазон: 2-5
true: можно искать поsupplier,brand,colorи т.д.false: динамические поля игнорируются
[[search.extended_fields]]` игнорируются, даже если они описаны в конфиге.
true: для нечеткого поиска обязательно наличиеname(режим совместимости, default)false: можно искать ТОЛЬКО по динамическим полям, без указанияname(коммерческий режим)
[[search.extended_fields]]` в PRO.
Защита от ситуации, когда все результаты имеют очень низкий score и относительный порог отбрасывает все.
- Рекомендуемое значение: 0.01-0.05
- Не меняйте без крайней необходимости
Защита от экспоненциального роста запросов при сложных поисках.
- Рекомендуемое: 300-1000
- 500 — баланс безопасности и точности
- При превышении — лишние клаузулы отбрасываются с предупреждением
- Если
trueиnameпустой — позволяет добавить/найти товар без названия, отключая стемминг/эмбеддинги для пустого имени. - Документ индексируется только по ID, code, art и т.п.
- Рекомендация:
trueдля справочников, где название неизвестно при загрузке;falseдля стандартного каталога.
- Включает точный поиск по реквизитам. Требует больше места на диске.
extra при поиске. Работает только при enable_attrs_indexing = true.
"hard"— точный фильтр: в результаты попадают только товары, у которых ВСЕ указанные в запросеextra-поля совпадают точно. Это поведение по умолчанию."soft"— бустирование: совпадение поextraувеличивает скор товара, но не отсекает товары без совпадения. Регулируется весомsearch.weights.extra_match_boost."off"— игнорироватьextraпри поиске: поля возвращаются в ответе, но не влияют на выборку и ранжирование.
- Автоматически извлекает ID из строк вида "e1cib/data/...?ref=..." или "{GUID} Название".
- Рекомендация: включайте, если в
nameчасто приходят 1С-ссылки; иначе оставьтеfalseдля экономии CPU.
- Обычно используется для артикулов, штрихкодов, внутренних кодов.
- Влияет только на прямой поиск по полю:
query.code,query.art,query.barcode. Например, приcase_sensitive_fields = ["code"]запросcode="ABC-123"найдет толькоABC-123, аcode="abc-123"— нет. - Поиск через общее поле
name(unified search) остается регистронезависимым: запросname="abc-123"найдет товар сcode="ABC-123". - Чтобы регистрозависимость exact-поиска заработала для уже загруженных данных, выполните переиндексацию после изменения этого параметра.
- Поиск по каким дополнительным полям будет РЕГИСТРОЗАВИСИМЫМ при прямом указании в запросе.
- Как и
case_sensitive_fields, не влияет на поиск через общее полеname.
408 Request Timeout не возвращается.
[search.weights] — Веса разных типов совпадений
- Увеличить (1.2-1.5) → точные совпадения выше в результатах
- Уменьшить (0.8-0.9) → точные совпадения менее важны
- Много опечаток → увеличьте до 0.8-0.85
- Нечеткий поиск часто ошибается → уменьшите до 0.5-0.6
Пример: запрос "болты" ищет "болты" (точное совпадение), а не "болт" (основа).
Формула: score × (1.0 + matched_tokens × coverage_boost_per_token)
- Запрос "болт м16 оцинкованный" (3 слова). Товар содержит все 3 → бонус 3×0.2=+60%
0.1— слабый бонус,0.2— баланс,0.3— сильный
- Запрос "болт" → "Болт м16" получает бонус
- "Гайка болт" — не получает (начинается с "гайка")
1.0— без бонуса,1.15— +15%,1.3— +30%
type.
- Поле
desc(точное совпадение) - Точное совпадение по полю
descполучает дополнительный бонус
ref.
extra-полям), найденным через search_by_attrs.
- Текстовый буст через плоские атрибуты
extra в режиме extra_filter_mode = "soft".
0.0— совпадение поextraне влияет на скор.0.3-0.5— мягкое приоритезирование: подходящие товары поднимаются выше, но не вытесняют релевантные по названию.1.0-2.0— сильный буст: товары с совпавшимиextraмогут оказаться на первых местах даже при менее точном совпадении поname.
"soft". В режиме "hard" совпадение по extra является обязательным фильтром, а в режиме "off" поля игнорируются при поиске.
\[search.fuzzy\] — Тонкая настройка нечеткого поиска
fuzzy_max_distance + 1.
1: минимальное расширение2: стандартное (рекомендуется)3: максимальное (может давать ложные срабатывания)
fuzzy_max_distance = 1 эффективное расстояние будет 2, т.е. пример "перф" → "перфоратор" (расстояние 5) недостижим. Если много ложных срабатываний — уменьшите до 2.
3: "пер" (короткий), "перф" (обычный)4: "перф" (короткий), "перфо" (обычный)5: "перфо" (короткий)
1.0: без буста2.0: умеренный буст4.0: сильный буст (рекомендуется)8.0: экстремальный (только для точных совпадений)
[search.strategy] — Как сервис ищет: быстро или точно
true: короткие запросы (1-3 слова) → последовательный (точнее), длинные (4+) → булевый (быстрее)false: всегда последовательный (максимальная точность)
2: быстрый переход на булевый (меньше точности)3: сбалансированный (рекомендуется)5: максимальная точность для длинных запросов (медленнее)
[search.edge_ngram] — Префиксный поиск для коротких запросов
2: найдет даже по 2 буквам ("пе" → "перфоратор"), но больше шума3: оптимально для русского языка (рекомендуется)4: только по 4 буквам ("перф" → "перфоратор")
5-6: оптимально (баланс)8-10: точнее, но индекс больше15: индекс в 2 раза больше
[search.extended_fields] — Динамические поля
- Для кодов (tnved, артикулы):
0.8-1.0 - Для названий (бренд, поставщик):
0.5-0.7 - Для характеристик (цвет, размер):
0.3-0.5
true: "поставщики" найдет "поставщик"false: только точное совпадение (для кодов и артикулов)
true: "Ромашка" найдет "Ромашкаа"false: только точное совпадение
[pro] — Профессиональные фичи (Enterprise)
pro.enabled в конфиге игнорируется.
[pro.index] — Продвинутые настройки индексации (PRO)
0 — используется значение из [index].writer_ram_budget_mb. Положительное значение переопределяет верхнеуровневый параметр только в PRO-сборке. При возникновении OOM на индексации установите 0, чтобы вернуться к общему значению.
commit_mode, commit_docs_threshold и commit_timeout_secs пока не реализованы; коммиты идут по стандартной политике поискового индекса.
[pro.cross_codes] — Кросс-коды и аналоги
10: для быстрых ответов30: стандарт (рекомендуется)50-100: для автозапчастей (много аналогов)
[pro.search.embedding] — Семантический поиск (векторные эмбеддинги)
[pro.search.embedding] — Общие настройки эмбеддингов
"bge_m3" или "e5" (default: "bge_m3"). "gemini" не реализован.
"./data/vectors.lance"
"lancedb" (default: "lancedb"). Параметр vector_db_type — устаревший синоним, игнорируется.
"auto"). Если не уверены — оставьте "auto".
| Значение | Когда использовать |
|---|---|
"auto" | По умолчанию. Хранилище само выберет индекс. |
"ivf_pq" | Большой каталог и ограниченная память. |
"ivf_hnsw_sq" | Нужна высокая скорость поиска, ресурсов достаточно. |
"ivf_hnsw_pq" | Компромисс между скоростью и размером индекса. |
"ivf_hnsw_flat" | Максимальная точность при поиске, но больше места на диске. |
"hnsw" | Для Qdrant — обычный HNSW-граф. Для встроенного векторного хранилища работает как "ivf_hnsw_sq". |
При смене значения старый индекс не перестраивается автоматически. Чтобы применить новый тип, выполните sku-cli embedding clear и снова проиндексируйте товары.
query_cache_size и query_cache_ttl_seconds не реализованы; размер и TTL общего кэша задаются через cache_max_size / cache_ttl_seconds.
"f32", "f16", "i8" (default: "f16"). В текущей версии векторное хранилище всегда хранит векторы как Float32; само значение к хранению не применяется.
fs_fuzzy_fallback_enabled не реализован.
bge_m3 или e5).
[pro.search.embedding.bge_m3] — Бэкенд BGE-M3
active_backend = "bge_m3", должен быть true, иначе сервис не запустится.
"./models/bge-m3-int8/model.onnx" (обязательный)
""). Пустая строка в pooling молча преобразуется в "mean".
"mean": усреднение векторов всех токенов. Самый стабильный вариант, рекомендуется для E5 и bge-m3."cls": вектор специального[CLS]-токена. Иногда чуть лучше для классификации, но может быть нестабилен для поиска."last": вектор последнего токена. Редко используется; может подойти для декодер-подобных моделей.
0 означает автовыбор эвристикой ONNX Runtime.
[pro.search.embedding.e5] — Бэкенд E5
"./models/e5-small-int8/model.onnx" (обязательный)
"e5-small", "e5-base", "e5-large" (default: "e5-small")
"mean", "cls", "last" (default: "", молча преобразуется в "mean")
[pro.search.embedding.gemini] — Бэкенд Google Gemini
active_backend = "gemini" сервис молча переключается на bge_m3. Секция сохранена для обратной совместимости, но не влияет на поведение.
[pro.search.embedding.hnsw] — Настройки HNSW индекса
num_edges).
[pro.search.embedding.lancedb] — Встроенное векторное хранилище
"./data/vectors.lance").
"embeddings").
"f32", "f16", "i8" (default: "f16").
[pro.search.embedding.qdrant] — Qdrant
use_grpc не реализован.
[pro.search.embedding.text_config] — Состав текста для эмбеддинга
" ")
# Пример конфигурации PRO с BGE-M3
[pro.search.embedding]
active_backend = "bge_m3"
vector_db_path = "./data/vectors.lance"
query_cache_enabled = true
[pro.search.embedding.bge_m3]
enabled = true
model_path = "./models/bge-m3-int8/model.onnx"
vector_dimension = 1024
enable_sparse = false
pooling = ""
intra_op_threads = 0
inter_op_threads = 0
session_pool_size = 1
# Пример переключения на E5-small
# [pro.search.embedding.e5]
# enabled = true
# model_path = "./models/e5-small-int8/model.onnx"
# model_type = "e5-small"
# vector_dimension = 384
# pooling = ""
# intra_op_threads = 0
# inter_op_threads = 0
# session_pool_size = 1
active_mode = "legacy") удален. Используйте active_backend и секции [pro.search.embedding.bge_m3] или [pro.search.embedding.e5]. Бэкенд Gemini не реализован.
[pro.search.orchestrator] — Оркестратор поиска
"fs_only": только полнотекстовый поиск (быстро, точно, default)"embedding_only": только эмбеддинги (семантический)"hybrid": последовательный гибрид"parallel": параллельный гибрид (максимальная скорость)
- Преимущество полнотекстового поиска:
0.8 / 0.2 - Сбалансированный (по умолчанию):
0.6 / 0.4 - Преимущество эмбеддингов:
0.4 / 0.6
"min_max": масштабирование на [0,1] по максимуму."robust": нормализация на 95-й перцентиль, менее чувствительна к выбросам (default)."z_score": центрирование на среднем и деление на std, затем масштабирование z-значений на [0,1]."softmax": экспоненциальное преобразование, сумма скоров после нормализации = 1."none": не нормализовать, использовать сырые скоры источника.
Режим влияет только на гибридный/параллельный поиск в PRO, когда скоры полнотекстового поиска и эмбеддингов объединяются.
[pro.background] — Фоновая очередь эмбеддингов
[pro.plugins.hierarchy] — Иерархические группы (PRO)
POST /hierarchy).
[security] — Безопасность и лимиты
[admin] — Администрирование
[feedback] — Обратная связь
POST /feedback
query_name— исходный запрос пользователя.matched_id_out— ID найденного товара.action—accept,rejectилиzero_result.
И опциональные поля для улучшенного анализа:
product_name,product_art,product_barcode— данные найденного товара.matched_by— поле, по которому произошло совпадение (name,code,art,barcode,attrs).position— позиция товара в выдаче.session_id— ID сессии для анализа реформулировок.expected_id— ID товара, который ожидал увидеть пользователь.
Пример:
{
"query_name": "болт м10",
"matched_id_out": "ID-001",
"action": "accept",
"product_name": "Болт М10х50 DIN 933",
"matched_by": "name",
"position": 1
}
GET /admin/learn — рекомендации
curl 'http://localhost:8080/admin/learn?type=synonym'
Типы рекомендаций:
synonym— предлагаемые синонимы на основе accept-записей.missing_product— популярные запросы без результатов (zero_result).check_product— товары с высоким reject rate.typo— возможные опечатки и альтернативные написания.
Каждая рекомендация содержит recommendation_type, title, description, confidence (0.0–1.0) и data.
[export] — Экспорт данных
[logging] — Логирование
file_rotate_max_size_mb > 0, ротация выполняется по размеру (имеет приоритет над file_rotate_by_age). Если 0 — ротация только по времени.
file_rotate_max_size_mb = 0): hourly, daily, weekly.
0 старые файлы не удаляются.