feat(ingest+поиск): приём ZIP через интерфейс, регистронезависимый поиск, чистка очереди
- Загрузка архива (§4.1): POST /ingest распаковывает ZIP, дораспознаёт и догружает прайсы в базу (append). Виджет в админке. Кэш эмбеддингов справочника (dict_emb.npy) — догрузка считает только новый файл, эмбеддинги best-effort с откатом на fuzzy при сбое Gemini. - Поиск по name_norm (lowercase): «УЗИ» и «узи» дают одинаковый результат — SQLite LIKE не сворачивает регистр для кириллицы. - Фильтр названий: код-мнемоники («МОЗО.15») больше не попадают в очередь. - /stats считается из базы — цифры на дашборде обновляются после загрузки. - Деплой через Dockerfile (зависимости в образе, код монтируется томом). - ruff: ядро и весь репозиторий проходят проверку. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
+4
-3
@@ -10,6 +10,7 @@
|
||||
отвечает только за загрузку и подготовку индексов; само сопоставление — в
|
||||
`etl/normalize`.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import re
|
||||
@@ -40,9 +41,9 @@ def normalize_name(text: str | None) -> str:
|
||||
class Service:
|
||||
"""Одна запись эталонного справочника услуг."""
|
||||
|
||||
service_id: str # стабильный идентификатор «<ID>-<Code>»
|
||||
specialty: str # специальность — служит и категорией, и сужением поиска
|
||||
name_ru: str # официальное название
|
||||
service_id: str # стабильный идентификатор «<ID>-<Code>»
|
||||
specialty: str # специальность — служит и категорией, и сужением поиска
|
||||
name_ru: str # официальное название
|
||||
tarificator_code: str | None # код тарификатора (если задан)
|
||||
name_norm: str = field(default="") # нормализованная форма name_ru
|
||||
|
||||
|
||||
Reference in New Issue
Block a user