Как это работает
Кратко о том, как устроен поиск тендеров и какие технологии используются.
Роль хранилищ
PostgreSQL
- Основная база: метаданные тендеров (eis_documents), очереди архивов, документов и ИИ-анализа.
- Поиск: поиск по фильтрам (даты, регионы, ключевые слова, ИНН, цена) выполняется по PostgreSQL: полнотекстовый поиск по полю title (морфология русского), фильтры по регионам, законам, ИНН, диапазону цен.
- Все данные из ЕИС сначала попадают сюда; без PostgreSQL система не работает.
Elasticsearch
- Назначение: полнотекстовая индексация метаданных (индекс
eis_tenders). - В поиске: при запросе с ключевыми словами выполняется полнотекстовый поиск по полю title; результат (tender_id) объединяется с Qdrant и передаётся в PostgreSQL для фильтров и выдачи.
Qdrant
- Назначение: векторное хранилище для семантического поиска (поиск «по смыслу»), коллекция
eis_tenders. - В поиске: при запросе с ключевыми словами запрос векторизуется, в Qdrant ищутся ближайшие векторы; tender_id объединяются с результатами из Elasticsearch и передаются в PostgreSQL.
Векторизация (сервис эмбеддингов)
- Назначение: получение векторов текста — при синке для каждого тендера и при поиске для текста запроса.
- Использование: при синке вектор пишется в Elasticsearch и Qdrant; при поиске по словам запрос пользователя векторизуется и идёт семантический поиск в Qdrant. Провайдер настраивается в конфигурации.
Цепочка при синке (каждые 15 минут)
- ЕИС → очередь URL архивов → воркер скачивает архивы, парсит XML.
- Для каждого тендера: сохранение в PostgreSQL → запрос вектора у сервиса эмбеддингов → запись в Elasticsearch и в Qdrant.
- Подсчёт вложений из XML и обновление files_count в PostgreSQL.
Документы тендера (PDF, Word) при синке не скачиваются — только метаданные и индексы.
Поиск на главной странице
- Пользователь задаёт фильтры (даты, регионы, ключевые слова, ИНН, цена, «не показывать без файлов»).
- Запрос уходит в
POST /api/search. При наличии ключевых слов задействуются Elasticsearch (полнотекст по title) и Qdrant (векторизация запроса и семантический поиск); объединённые tender_id передаются в PostgreSQL. PostgreSQL применяет все фильтры и возвращает итог. - В ответе — список тендеров и статистика по хранилищам. Кнопка «Показать все тендеры с ИИ-анализом» выводит тендеры с готовым ИИ-анализом.
Документы и ИИ-анализ
- Скачивание файлов тендера запускается только пользователем (кнопка «Запустить ИИ-анализ»). Файлы сохраняются в S3.
- После загрузки всех файлов воркер отправляет документы в сервис ИИ-анализа (через настроенный прокси): документы конвертируются в текст, результат сохраняется в PostgreSQL и отображается на странице тендера.
Подробнее: docs/process-overview.md, docs/flow.md, docs/system-architecture.md.