Объяснение схемы
Схема определяет структуру данных коллекции. Перед созданием коллекции необходимо разработать проект её схемы. Эта страница поможет вам понять, что такое схема коллекции, и самостоятельно разработать пример схемы.
Обзор
В Milvus схема коллекции соответствует таблице в реляционной базе данных, которая определяет, как Milvus организует данные в коллекции.
Хорошо спроектированная схема имеет решающее значение, поскольку она абстрагирует модель данных и определяет, сможете ли вы достичь бизнес-целей с помощью поиска. Кроме того, поскольку каждая строка данных, вставляемая в коллекцию, должна соответствовать схеме, это помогает поддерживать согласованность данных и их качество в долгосрочной перспективе. С технической точки зрения, четко определённая схема обеспечивает упорядоченное хранение данных в столбцах и более понятную структуру индекса, что повышает производительность поиска.
Схема коллекции содержит первичный ключ, как минимум одно векторное поле и несколько скалярных полей. На приведённой ниже диаграмме показано, как сопоставить статью со списком полей схемы.
Структура проектирования схемы
Проектирование модели данных поисковой системы включает анализ бизнес-потребностей и абстрагирование информации в модель данных, выраженную в виде схемы. Например, поиск по фрагменту текста должен быть «индексирован» путем преобразования литеральной строки в вектор с помощью «встраивания» и включения векторного поиска. Помимо этого основного требования может потребоваться хранение других свойств, таких как метка времени публикации и автор. Эти метаданные позволяют уточнять семантический поиск с помощью фильтрации, возвращая только тексты, опубликованные после определенной даты или написанные конкретным автором. Вы также можете извлечь эти скалярные значения вместе с основным текстом для отображения результатов поиска в приложении. Каждому из них следует присвоить уникальный идентификатор для систематизации этих фрагментов текста, выраженный в виде целого числа или строки. Эти элементы необходимы для реализации сложной логики поиска.
Ознакомьтесь с руководством «Практическое проектирование схем», чтобы узнать, как создать хорошо спроектированную схему.
Создание схемы
Следующий фрагмент кода демонстрирует, как создать схему.
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
]
}"