Объяснение схемы

Схема определяет структуру данных коллекции. Перед созданием коллекции необходимо разработать проект её схемы. Эта страница поможет вам понять, что такое схема коллекции, и самостоятельно разработать пример схемы.

Обзор

В Milvus схема коллекции соответствует таблице в реляционной базе данных, которая определяет, как Milvus организует данные в коллекции.

Хорошо спроектированная схема имеет решающее значение, поскольку она абстрагирует модель данных и определяет, сможете ли вы достичь бизнес-целей с помощью поиска. Кроме того, поскольку каждая строка данных, вставляемая в коллекцию, должна соответствовать схеме, это помогает поддерживать согласованность данных и их качество в долгосрочной перспективе. С технической точки зрения, четко определённая схема обеспечивает упорядоченное хранение данных в столбцах и более понятную структуру индекса, что повышает производительность поиска.

Схема коллекции содержит первичный ключ, как минимум одно векторное поле и несколько скалярных полей. На приведённой ниже диаграмме показано, как сопоставить статью со списком полей схемы.

Schema Design Anatomy Структура проектирования схемы

Проектирование модели данных поисковой системы включает анализ бизнес-потребностей и абстрагирование информации в модель данных, выраженную в виде схемы. Например, поиск по фрагменту текста должен быть «индексирован» путем преобразования литеральной строки в вектор с помощью «встраивания» и включения векторного поиска. Помимо этого основного требования может потребоваться хранение других свойств, таких как метка времени публикации и автор. Эти метаданные позволяют уточнять семантический поиск с помощью фильтрации, возвращая только тексты, опубликованные после определенной даты или написанные конкретным автором. Вы также можете извлечь эти скалярные значения вместе с основным текстом для отображения результатов поиска в приложении. Каждому из них следует присвоить уникальный идентификатор для систематизации этих фрагментов текста, выраженный в виде целого числа или строки. Эти элементы необходимы для реализации сложной логики поиска.

Ознакомьтесь с руководством «Практическое проектирование схем», чтобы узнать, как создать хорошо спроектированную схему.

Создание схемы

Следующий фрагмент кода демонстрирует, как создать схему.

from pymilvus import MilvusClient, DataType

schema = MilvusClient.create_schema()
import io.milvus.v2.service.collection.request.CreateCollectionReq;

CreateCollectionReq.CollectionSchema schema = client.createSchema();
import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";

const schema = []
import "github.com/milvus-io/milvus/client/v2/entity"

schema := entity.NewSchema()
export schema='{
    "fields": []
}'

Добавление первичного поля

Первичное поле в коллекции однозначно идентифицирует сущность. Оно принимает только значения типа Int64 или VARCHAR. Приведенные ниже фрагменты кода демонстрируют, как добавить первичное поле.

schema.add_field(
    field_name="my_id",
    datatype=DataType.INT64,
    is_primary=True,
    auto_id=False,
)
import io.milvus.v2.common.DataType;
import io.milvus.v2.service.collection.request.AddFieldReq; 

schema.addField(AddFieldReq.builder()
        .fieldName("my_id")
        .dataType(DataType.Int64)
        .isPrimaryKey(true)
        .autoID(false)
        .build());
schema.push({
    name: "my_id",
    data_type: DataType.Int64,
    is_primary_key: true,
    autoID: false
});
schema.WithField(entity.NewField().WithName("my_id").
    WithDataType(entity.FieldTypeInt64).
    WithIsPrimaryKey(true).
    WithIsAutoID(false),
)
export primaryField='{
    "fieldName": "my_id",
    "dataType": "Int64",
    "isPrimary": true
}'

export schema='{
    \"autoID\": false,
    \"fields\": [
        $primaryField
    ]
}'

При добавлении поля вы можете явно указать его в качестве первичного, установив для свойства ` is_primary ` значение ` True`. По умолчанию первичное поле принимает значения типа `Int64`. В этом случае значения первичного поля должны быть целыми числами, например: ` 12345`. Если вы решите использовать в первичном поле значения типа `VARCHAR`, они должны быть строками, например: ` my_entity_1234`.

Вы также можете установить свойства autoId на True, чтобы Milvus автоматически назначал значения первичного поля при вставке данных.

Рекомендуется во всех случаях полагаться на функцию « autoId », за исключением тех случаев, когда ручная настройка первичных ключей приносит пользу.

Подробности см. в разделе «Первичное поле и AutoId».

Добавление векторных полей

Векторные поля поддерживают различные разреженные и плотные векторные вложения. В Milvus в коллекцию можно добавить до четырёх векторных полей. Приведённые ниже фрагменты кода демонстрируют, как добавить векторное поле.

schema.add_field(
    field_name="my_vector",
    datatype=DataType.FLOAT_VECTOR,
    dim=5
)
schema.addField(AddFieldReq.builder()
        .fieldName("my_vector")
        .dataType(DataType.FloatVector)
        .dimension(5)
        .build());
schema.push({
    name: "my_vector",
    data_type: DataType.FloatVector,
    dim: 5
});
schema.WithField(entity.NewField().WithName("my_vector").
    WithDataType(entity.FieldTypeFloatVector).
    WithDim(5),
)
export vectorField='{
    "fieldName": "my_vector",
    "dataType": "FloatVector",
    "elementTypeParams": {
        "dim": 5
    }
}'

export schema="{
    \"autoID\": false,
    \"fields\": [
        $primaryField,
        $vectorField
    ]
}"

Параметр ` dim ` в приведенных выше фрагментах кода указывает размерность векторных вложений, которые будут храниться в векторном поле. Значение ` FLOAT_VECTOR ` означает, что векторное поле содержит список 32-битных чисел с плавающей запятой, которые обычно используются для представления антилогарифмов. Кроме того, Milvus также поддерживает следующие типы векторных вложений:

  • FLOAT16_VECTOR

    Векторное поле этого типа содержит список 16-битных чисел с половинной точностью и обычно применяется в сценариях глубокого обучения или вычислений на GPU, ограниченных объемом памяти или пропускной способностью.

  • BFLOAT16_VECTOR

    Векторное поле этого типа содержит список 16-битных чисел с плавающей запятой, которые имеют пониженную точность, но тот же диапазон экспонент, что и Float32. Данный тип данных широко используется в сценариях глубокого обучения, поскольку он позволяет сократить использование памяти без существенного ущерба для точности.

  • INT8_VECTOR

    Векторное поле этого типа хранит векторы, состоящие из 8-битных целых чисел со знаком (int8), причем значение каждого компонента лежит в диапазоне от –128 до 127. Разработанный специально для квантованных архитектур глубокого обучения, таких как ResNet и EfficientNet, он существенно уменьшает размер модели и повышает скорость инференса, при этом потери точности минимальны. Примечание: этот тип вектора поддерживается только для индексов HNSW.

  • BINARY_VECTOR

    Векторное поле этого типа содержит список нулей и единиц. Эти значения служат в качестве компактных признаков для представления данных в сценариях обработки изображений и поиска информации.

  • SPARSE_FLOAT_VECTOR

    Векторное поле этого типа содержит список ненулевых чисел и их порядковые номера для представления разреженных векторных вложений.

Добавление скалярных полей

В типичных случаях скалярные поля можно использовать для хранения метаданных векторных вложений, хранящихся в Milvus, а также для проведения поиска с помощью нейронных сетей (ANN) с фильтрацией по метаданным, что позволяет повысить точность результатов поиска. Milvus поддерживает несколько типов скалярных полей, включая VARCHAR, Boolean, Int, Float и Double.

Добавление полей VARCHAR

В Milvus для хранения строк можно использовать поля типа « VARCHAR ». Подробнее о поле « VARCHAR » см. в разделе «Поле VarChar».

schema.add_field(
    field_name="my_varchar",
    datatype=DataType.VARCHAR,
    max_length=512
)
schema.addField(AddFieldReq.builder()
        .fieldName("my_varchar")
        .dataType(DataType.VarChar)
        .maxLength(512)
        .build());
schema.push({
    name: "my_varchar",
    data_type: DataType.VarChar,
    max_length: 512
});
schema.WithField(entity.NewField().WithName("my_varchar").
    WithDataType(entity.FieldTypeVarChar).
    WithMaxLength(512),
)
export varCharField='{
    "fieldName": "my_varchar",
    "dataType": "VarChar",
    "elementTypeParams": {
        "max_length": 512
    }
}'

export schema="{
    \"autoID\": false,
    \"fields\": [
        $primaryField,
        $vectorField,
        $varCharField
    ]
}"

Добавление числовых полей

Milvus поддерживает следующие типы чисел: Int8, Int16, Int32, Int64, Float и Double. Подробнее о числовых полях см. в разделе «Числовое поле».

schema.add_field(
    field_name="my_int64",
    datatype=DataType.INT64,
)
schema.addField(AddFieldReq.builder()
        .fieldName("my_int64")
        .dataType(DataType.Int64)
        .build());
schema.push({
    name: "my_int64",
    data_type: DataType.Int64,
});
schema.WithField(entity.NewField().WithName("my_int64").
    WithDataType(entity.FieldTypeInt64),
)
export int64Field='{
    "fieldName": "my_int64",
    "dataType": "Int64"
}'

export schema="{
    \"autoID\": false,
    \"fields\": [
        $primaryField,
        $vectorField,
        $varCharField,
        $int64Field
    ]
}"

Добавление булевых полей

Milvus поддерживает булевы поля. Приведенные ниже фрагменты кода демонстрируют, как добавить булево поле.

schema.add_field(
    field_name="my_bool",
    datatype=DataType.BOOL,
)
schema.addField(AddFieldReq.builder()
        .fieldName("my_bool")
        .dataType(DataType.Bool)
        .build());
schema.push({
    name: "my_bool",
    data_type: DataType.Boolean,
});
schema.WithField(entity.NewField().WithName("my_bool").
    WithDataType(entity.FieldTypeBool),
)
export boolField='{
    "fieldName": "my_bool",
    "dataType": "Boolean"
}'

export schema="{
    \"autoID\": false,
    \"fields\": [
        $primaryField,
        $vectorField,
        $varCharField,
        $int64Field,
        $boolField
    ]
}"

Добавление составных полей

В Milvus составным полем называется поле, которое можно разделить на более мелкие подполя, такие как ключи в поле JSON или индексы в поле Array.

Добавление полей JSON

Поле JSON обычно хранит полуструктурированные данные JSON. Подробнее о полях JSON см. в разделе «Поле JSON».

schema.add_field(
    field_name="my_json",
    datatype=DataType.JSON,
)
schema.addField(AddFieldReq.builder()
        .fieldName("my_json")
        .dataType(DataType.JSON)
        .build());
schema.push({
    name: "my_json",
    data_type: DataType.JSON,
});
schema.WithField(entity.NewField().WithName("my_json").
    WithDataType(entity.FieldTypeJSON),
)
export jsonField='{
    "fieldName": "my_json",
    "dataType": "JSON"
}'

export schema="{
    \"autoID\": false,
    \"fields\": [
        $primaryField,
        $vectorField,
        $varCharField,
        $int64Field,
        $boolField,
        $jsonField
    ]
}"

Добавление массивных полей

Поле массива хранит список элементов. Типы данных всех элементов в поле массива должны быть одинаковыми. Подробнее о полях массива см. в разделе «Поле массива».

schema.add_field(
    field_name="my_array",
    datatype=DataType.ARRAY,
    element_type=DataType.VARCHAR,
    max_capacity=5,
    max_length=512,
)
schema.addField(AddFieldReq.builder()
        .fieldName("my_array")
        .dataType(DataType.Array)
        .elementType(DataType.VarChar)
        .maxCapacity(5)
        .maxLength(512)
        .build());
schema.push({
    name: "my_array",
    data_type: DataType.Array,
    element_type: DataType.VarChar,
    max_capacity: 5,
    max_length: 512
});
schema.WithField(entity.NewField().WithName("my_array").
    WithDataType(entity.FieldTypeArray).
    WithElementType(entity.FieldTypeInt64).
    WithMaxLength(512).
    WithMaxCapacity(5),
)
export arrayField='{
    "fieldName": "my_array",
    "dataType": "Array",
    "elementDataType": "VarChar",
    "elementTypeParams": {
        "max_length": 512
    }
}'

export schema="{
    \"autoID\": false,
    \"fields\": [
        $primaryField,
        $vectorField,
        $varCharField,
        $int64Field,
        $boolField,
        $jsonField,
        $arrayField
    ]
}"