Концептуальная модель предметной области#

erDiagram COLLECTION ||--o{ POINT : "Содержит" COLLECTION ||--o{ INDEX : "Обладает" COLLECTION }|--|| CLUSTER : "Принадлежит" QUERY }o--|| COLLECTION : "Выполняется над" CLUSTER ||--o{ NODE : "Состоит из" NODE ||--o{ SHARD : "Управляет" SHARD ||--o{ REPLICA : "Содержит" INDEX ||--o{ POINT : "Индексирует" COLLECTION { string id "Идентификатор" int vector_dimension "Размерность векторов" enum distance_metricv "Метрика расстояния" json segment_config "Параметры сегментов" int replication_factor "Настройка репликации" bool is_active "Состояние" } POINT { uuid id "Идентификатор" float[] vector "Векторное представление" json payload "Полезная нагрузка" string collection_id "Идентификатор коллекции" } INDEX { string id "Идентификатор" enum type "Тип индекса" json parameters "Параметры индексации" bool is_built "Статус" string collection_id "Идентификатор коллекции" } QUERY { uuid id "Идентификатор" enum query_type "Тип запроса" float[] query_vector "Вектор запроса" json filter_conditions "Условия фильтрации" int limit "Лимит запросов" float score_threshold "Порог ролевантности" string collection_id "Идентификатор коллекции" } CLUSTER { string id "Идентификатор" int node_count "Количество узлов" } NODE { string id "Идентификатор" string address "Сетевой адрес" string cluster_id "Идентификатор кластер" } SHARD { string id "Идентификатор" string node_id "Идентификатор узла" } REPLICA { string id "Идентификатор" bool is_leader "Является лидером" string shard_id "Идентификатор шарда" }

Пояснения:

  • Коллекция (Collection):

    • Именованный набор точек (векторов с полезной нагрузкой), среди которых можно выполнять поиск. Вектор каждой точки внутри одной коллекции должен иметь одинаковую размерность и сравниваться по единым метрикам расстояний.

    • Связи: содержит точки, принадлежит кластеру, обладает индексами.

    • Пример: коллекция «Изображения» с векторами 512D и косинусной метрикой.

  • Точка (Point):

    • центральная сущность, с которой работает продукт. Точка представляет собой запись, состоящую из вектора и необязательной полезной нагрузки.

    • Связи: принадлежит коллекции, индексируется.

    • Пример: вектор [0.1, 0.2, ...] с payload {"image_id": 123, "category": "cat"}.

  • Индекс (Index):

    • Структура для ускорения поиска. Оптимизирует запросы (например, HNSW для приближенного поиска). Ключевой особенностью является эффективное сочетание векторных и традиционных индексов.

    • Связи: строится для коллекции.

    • Пример: HNSW-индеĸс с параметрами m=16, ef_construction=200.

  • Запрос (Query)

    • Операция поиска или фильтрации с целью получения релевантных точек.

    • Связи: выполняется над коллекцией.

    • Пример: найти 10 ближайших векторов ĸ [0.3, 0.5, ...] с фильтром "price < 50".

  • Кластер (Cluster)

    • Группа серверов для распределенного хранения. Используется для масштабируемости и отказоустойчивости.

    • Связи: управляет коллекциями, распределяет нагрузку.

    • Пример: 3 узла с шардированием данных.

  • Узел (Node)

    • Физический/виртуальный сервер в кластере. Хранит часть данных (шарды).

    • Связи: является частью кластера, управляет шардами.

    • Пример: сервер node-1 с IP {ip_address}.

  • Шард (Shard)

    • Логический раздел данных в узле. Используется для горизонтального масштабирования.

    • Пример: шард shard-1 хранит точки с ID от 1 до 1 млн.

  • Реплика (Replica)

    • Копия шарда для отказоустойчивости и балансировка нагрузки.

    • Пример: реплика shard-1-replica-2 на node-2.