Базы данных и поиск по видео: индексация событий и меток
Видео хранится быстро, а искать в нём — медленно. Эта статья объясняет, как структурировать и индексировать события и метки в видеопотоке, чтобы находить нужные фрагменты по тексту, времени и изображению — быстро и надёжно. Подойдёт и для домовладельцев, и для инсталляторов, и для IT‑специалистов.
Зачем индексировать события и метки
Индексация даёт несколько очевидных выгод:
- сокращает время на поиск нужных эпизодов;
- позволяет делать автоматические оповещения по событиям (периметр, движение, лица);
- даёт бизнес‑аналитику (плотность потока людей, расписание посетителей);
- упрощает совместную работу и расследование инцидентов.
Какие данные (метаданные) хранить
Ключевые поля, которые стоит индексировать:
- timestamp — время события/кадра;
- camera_id, stream_id;
- event_type — движение, лицо, авто, пересечение периметра;
- bbox / coords — координаты объекта в кадре;
- embeddings — вектор признаков для визуального поиска;
- labels и confidence — распознанные классы и вероятности;
- source_file / chunk_id / offset — ссылка на видеофайл и позиция;
- extra — температура датчика, ID карты доступа и т. п.
Совет: храните «сырые» метки и версию модели, чтобы при перекалибровке можно было пересчитать и вернуть старые результаты.
Выбор СУБД: что и когда
Три характерных подхода:
- Реляционные базы (PostgreSQL) — для точных транзакций, связей между событиями и справочниками. Удобно для интеграции с системами контроля доступа.
- Колонковые / аналитические (ClickHouse) — для быстрой агрегации по миллионам событий (отчёты, BI).
- Поисковые движки (Elasticsearch) — для полнотекстового, гео‑ и временного поиска, а также для сочетания с метриками.
- Векторные БД (Milvus, Pinecone) — для поиска похожих лиц/объектов по embeddings.
- Объектное хранилище (S3/MinIO) — для самих видеофайлов, метаданные в БД.
Таблица: сравнение
| Задача | Подход | Плюсы | Минусы |
| Аналитика по событиям | ClickHouse | Очень быстрое агрегации | Неудобно для транзакций |
| Поиск по меткам/тексту | Elasticsearch | Гибкие запросы, фильтры | Требует ресурсов |
| Визуальный поиск | Векторная БД | Поиск похожих изображений | Потребляет память |
| Связи и справочники | PostgreSQL | Надёжные транзакции | Медленнее при больших объёмах |
Архитектура индексации — как это обычно работает
Простейший pipeline:
1. Камера/регистратор пишет видео в объектное хранилище.
2. Преобразователь (FFmpeg) режет видео на чанки и извлекает ключевые кадры.
3. Аналитика (модели детекции/детектора лиц/видеоаналитики) создаёт события, bbox, embeddings.
4. Метаданные записываются в БД/поисковик, векторы — в векторную БД.
5. По запросу система получает список фрагментов и обращается к объектному хранилищу для воспроизведения.
Пример простого JSON события:
{"timestamp":"2026-02-28T12:34:10Z","camera_id":"cam12","event_type":"motion","bbox":[0.12,0.34,0.23,0.45],"confidence":0.92,"chunk_id":"vid1234","offset":7420}
Примеры запросов
- SQL (Postgres/ClickHouse): найти события движения на cam12 за последний час:
SELECT * FROM events WHERE camera_id='cam12' AND event_type='motion' AND timestamp > now() - interval '1 hour';
- Elasticsearch: поиск по меткам и диапазону времени с агрегацией по камере.
- Векторный поиск: найти 10 ближайших embeddings к образцу лица и затем отфильтровать по времени.
Практические советы по масштабированию и хранению
- Храните только ключевые кадры и embeddings онлайн; «сырой» архив — в дешёвом cold хранилище.
- Делайте retention policy: например, 30 дней хорошо для большинства коммерческих объектов, спецхранение для инцидентов.
- Используйте шардирование по camera_id или по дате.
- Кешируйте популярные запросы и результаты аналитики.
- Отслеживайте латентность записи и поиска; для real‑time событий нужны быстрые очереди (Kafka, RabbitMQ).
Безопасность и соответствие законодательству
- Видеозапись — персональные данные. Храните логи доступа к записям.
- Шифруйте видео и метаданные при хранении и в передаче.
- Уведомляйте пользователей о видеонаблюдении там, где это требуется.
- Для критических объектов ограничьте доступ по ролям и аудируйте запросы.
Типовые ошибки и как их избежать
- Хранить все кадры без индексации — поиск становится невозможным.
- Писать embeddings в текстовую колонку — тормозит поиск.
- Игнорировать версионирование моделей аналитики — результаты меняются, и это нужно учитывать.
- Не планировать рост: оцените количество событий в секунду и расчётно спроектируйте БД.
Сколько это стоит — примерная оценка
Простой расчёт для 100 камер, Full HD, 10 FPS аналитики:
- Хранение метаданных — десятки GB в год.
- Embeddings (512 float) ~ 2 KB на объект; при 1 млн объектов — ~2 GB.
- Серверы для запросов/индексов — от одного небольшого VM до кластера, зависит от SLA.
Короткий чек‑лист перед внедрением
- Определите, какие события действительно нужны.
- Выберите СУБД для метаданных + векторную БД при визуальном поиске.
- Настройте pipeline: кадр→анализ→индекс.
- Пропишите retention и права доступа.
- Тестируйте поиск на реальных нагрузках.
Где начать с оборудованием и монтажом
Если нужен готовый набор камер и регистраторов или монтаж под ключ, посмотрите каталог систем видеонаблюдения: https://y-ss.ru/catalog/sistemy_videonablyudeniya/
Мягкая мысль в конце: сначала решите, какие вопросы вы хотите быстро решать при поиске в видео, затем постройте простую схему метаданных и один индекс, а уже потом масштабируйте и добавляйте визуальные индексы. Это помогает избежать перерасхода ресурсов и получить рабочую систему быстрее.