Перейти к содержанию

Основные положения#

Дополнительный модуль 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 с меткой времени может иметь миллионы уникальных значений — высокая кардинальность. Правильный порядок: genderageend_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 приведено в разделе "Диаграммы последовательности".