Основные положения#
Дополнительный модуль LUNA Vinder Module:
- создаёт и поддерживает специализированные копии данных (проекции);
- настраивает индексы для оптимизации данных в проекциях;
- загружает данные проекций в оперативную память и выполняет сравнение.
LVM содержит следующие сервисы:
- Projector — создаёт и управляет проекциями данных;
- Matcher — загружает проекции в оперативную память, строит индексы и выполняет сравнение БШ.
Для работы модуля требуются следующие сервисы LUNA PLATFORM:
-
LUNA Configurator — для управления конфигурацией системы.
-
LUNA Events — как источник данных для создания и синхронизации проекций.
-
LUNA Python Matcher Proxy — для интеграции плагина поиска.
Проекции#
Проекции — это специализированные копии данных, оптимизированные для сравнения биометрических шаблонов. Вместо выполнения сравнения напрямую в основной базе данных LVM создаёт проекции — подмножества данных, соответствующие определённым условиям сравнения. Это значительно ускоряет и повышает эффективность матчинга, одновременно снижая нагрузку на основное хранилище данных.
Проекция представляет собой отфильтрованное и оптимизированное представление данных. При создании проекции вы определяете несколько ключевых параметров: какие события включать в проекцию с помощью фильтров, какие атрибуты этих событий сохранять через поля targets, откуда получать исходные данные, указывая их источник, и как организовать эту проекцию, выбирая её тип. Такой подход позволяет создавать несколько проекций, каждая из которых адаптирована к конкретному сценарию сравнения и содержит только релевантную информацию. Например, если вам нужно выполнять сравнение только среди событий из определённого источника за последний месяц, проекция будет содержать только эти события, а не все миллионы или миллиарды записей в основном хранилище.
Важно учитывать, что каждая проекция представляет собой отдельную копию данных в памяти Matcher. При создании нескольких проекций данные дублируются для каждой из них в соответствии с её фильтрами и набором атрибутов. Это обеспечивает максимальную производительность для сравнения, но требует соответствующего планирования ресурсов памяти.
Компоненты проекции#
- Источник данных (origin)
Источник определяет, откуда Projector будет извлекать данные для проекции. Выбор источника определяет не только источник данных, но и атрибуты, доступные для фильтрации и выбора, поскольку разные источники имеют разную структуру данных.
В настоящее время в качестве источника данных поддерживается БД сервиса Events LUNA PLATFORM, которая содержит БШ объектов и связанные с ними метаданные (время создания и др.).
- Фильтры
Фильтры определяют, какие именно объекты из указанного источника должны быть включены в проекцию. Это один из ключевых механизмов оптимизации — правильно настроенные фильтры позволяют включать в проекцию только действительно необходимые данные, сокращая объём обрабатываемой информации.
Если фильтры не указаны, в проекцию будут включены все события из источника. Конкретные поля и операторы, доступные для фильтрации, зависят от источника данных. Полный список доступных фильтров см. в документации API.
- Поля targets
Поля targets определяют, какие атрибуты событий будут сохранены в проекции вместе с БШ.
Необходимо указать атрибуты, который вы хотите использовать в составных полях индекса или возвращать в результатах.
- Тип проекции (projection type)
Тип проекции определяет, как данные будут храниться и обрабатываться в системе. В настоящее время поддерживается тип view — конфигурация для выборки данных, на основе которой Matcher создаёт оптимизированную копию в памяти. Когда компоненты LUNA Vinder Module обращаются к проекции типа view, данные извлекаются из источника согласно указанным фильтрам и полям targets.
Индекс#
После создания проекции необходимо определить, как сервис Matcher будет организовывать эти данные для выполнения сравнения. Здесь появляется понятие индекса. Индекс указывает список полей (composite fields), которые определяют две важные вещи: какие атрибуты из проекции можно использовать в качестве фильтров в поисковых запросах и как данные будут иерархически организованы в оперативной памяти Matcher.
Когда Matcher загружает индекс, он строит древовидную структуру, в которой данные постепенно разделяются согласно значениям указанных составных полей. Это дерево позволяет Matcher быстро переходить к соответствующему подмножеству БШ без сканирования всего набора данных. Например, если ваш индекс имеет составные поля для пола и возраста, Matcher может мгновенно найти все БШ для мужчин в возрасте 30 лет, не проверяя БШ для женщин или других возрастных групп.
Грамотная конфигурация индексов является ключевым фактором производительности LUNA Vinder Module.
Компоненты индекса#
- Ссылка на проекцию
Каждый индекс строится на определённой проекции, на которую ссылается её projection_id. Индекс может работать только с данными и атрибутами, которые определены в этой проекции.
Примечание. Наличие проекции является обязательным условием для создания индекса. Проекция определяет, какие данные доступны, а индекс — как эти данные организованы для поиска.
- Составные поля (composite fields)
Составные поля — это упорядоченный список имён атрибутов, который определяет структуру дерева данных и какие фильтры могут применяться во время сравнения. Порядок указания полей критически важен и напрямую влияет на производительность матчинга.
Поля должны располагаться в порядке возрастания кардинальности — от полей с наименьшим количеством уникальных значений к полям с наибольшим количеством уникальных значений. Кардинальность — это количество различных значений, которые может принимать поле.
Например, поле gender обычно имеет только 2-3 уникальных значения (мужской, женский, неопределён) — это низкая кардинальность. Поле age может иметь десятки уникальных значений — средняя кардинальность. Поле end_time с меткой времени может иметь миллионы уникальных значений — высокая кардинальность. Правильный порядок: gender → age → end_time.
Важно! Не рекомендуется добавлять в "composite fields" поля с высокой кардинальностью, так как для каждого уникального значения создаётся отдельная ветка в дереве. Это может привести к неэффективной структуре при работе с миллионами записей.
Пустые составные поля также допустимы и создают индекс без возможности фильтрации. Такой индекс позволяет осуществлять сравнение по всем данным в проекции без применения каких-либо фильтров.
Примечание. Поле create_time всегда доступно для фильтрации и не должно указываться в составных полях. Для него реализован оптимизированный механизм, который избегает проблем, характерных для полей с высокой кардинальностью.
Создание индекса#
Индексы настраиваются через сервис LUNA Configurator путём добавления записей в настройку LUNA_VINDER_INDEXES. Каждая конфигурация индекса содержит:
projection_id— идентификатор проекции, на которой построен этот индексindex_composite_fields— упорядоченный список имён полей для индекса
Пример конфигурации:
LUNA_VINDER_INDEXES = [
{
"projection_id": "49ddbfb3-4b19-4c00-a165-df2a9fc7f321",
"index_composite_fields": ["gender", "age"]
},
{
"projection_id": "a7b2c891-5d3e-4f12-8c9a-1e4f5b6d7c8e",
"index_composite_fields": ["handler_id", "age", "emotion"]
},
{
"projection_id": "3f8d9c2b-1a4e-4d5f-9b8c-7e6d5c4b3a2f",
"index_composite_fields": []
}
]
В этом примере определены три индекса: один позволяет фильтровать по полу и возрасту, другой — по обработчику, возрасту и эмоциям, и третий — без полей фильтрации.
После добавления или изменения конфигураций индексов в Configurator Matcher автоматически обнаруживают изменения и начинают процесс загрузки данных. Matcher связывается с Projector для доступа к указанной проекции, извлекает все данные согласно фильтрам и полям targets проекции, загружает БШ в память, отсортированные по create_time, и строит древовидную структуру согласно спецификации составных полей.
Сервис Matcher сначала загружает все индексы и только после завершения загрузки становится доступным для выполнения матчинга. Этот процесс может занять значительное время, особенно для проекций, содержащих миллионы записей. После завершения загрузки Matcher помечает индексы как готовые и начинает принимать запросы на сравнение.
Синхронизация индексов
Matcher непрерывно отслеживает изменения в проекциях. Когда в проекцию добавляются новые события, обновляются или удаляются существующие, Matcher обнаруживает эти изменения и обновляет индексы в памяти. Это гарантирует, что результаты сравнения всегда отражают текущее состояние данных.
Синхронизация происходит автоматически в фоновом режиме без необходимости ручного вмешательства. Частоту проверки синхронизации можно настроить в параметрах Matcher, чтобы сбалансировать требования к актуальности данных и нагрузку на систему.
Процесс сравнения#
Этап создания проекции и настройки индексов должен быть выполнен перед отправкой запроса на сравнение.
Процесс сравнения включает следующие этапы:
1. Определение подходящего индекса
При поступлении запроса на сравнение из сервиса API в Python Matcher Proxy, плагин сравнения анализирует указанные фильтры и определяет, какие индексы могут обработать запрос. Выбор основан на соответствии полей фильтрации составным полям индекса и совместимости фильтров проекции.
2. Фильтрация данных
Matcher использует древовидную структуру индекса для быстрого нахождения соответствующего подмножества БШ. Например, при наличии полей gender и age в индексе, система локализует все БШ для мужчин определённого возраста без перебора остальных данных.
3. Сравнение БШ
Matcher выполняет сравнение входящего БШ только с найденным подмножеством и возвращает наиболее похожие объекты с оценкой сходства.
Результаты сравнения#
В результате успешного выполнения запроса сервис API получает список событий, ранжированных по степени сходства. Каждый результат содержит:
- информацию о событии;
- степень сходства (similarity);
- атрибуты события, которые были указаны в поле targets проекции.
Факторы производительности#
Производительность сравнения обеспечивается за счёт:
- хранения данных в оперативной памяти Matcher'а
- оптимальной организации данных согласно порядку полей в индексе
- навигации по древовидной структуре вместо последовательного перебора
- возможности настройки количества потоков (см. THREAD_COUNT) для параллельной обработки запросов.
Это позволяет системе обрабатывать запросы с минимальными задержками при работе с большим объемом данных.
Подробное описание процессов LUNA Vinder Module приведено в разделе "Диаграммы последовательности".