スキーマの説明
スキーマはコレクションのデータ構造を定義します。コレクションを作成する前に、そのスキーマの設計を検討する必要があります。このページでは、コレクションスキーマを理解し、独自のサンプルスキーマを設計する方法を説明します。
概要
Zilliz Cloud では、コレクションスキーマはリレーショナルデータベースのテーブルに相当し、Zilliz Cloud がコレクション内のデータをどのように編成するかを定義します。
適切に設計されたスキーマは、データモデルを抽象化し、検索を通じてビジネス目標を達成できるかどうかを決定するため、不可欠です。さらに、コレクションに挿入されるすべてのデータ行はスキーマに従う必要があるため、データの一貫性と長期的な品質の維持に役立ちます。技術的な観点では、適切に定義されたスキーマにより、列データのストレージが整理され、インデックス構造がよりクリーンになり、検索パフォーマンスが向上します。
コレクションスキーマには、主キー、少なくとも 1 つのベクトルフィールド、および複数のスカラーフィールドがあります。次の図は、記事をスキーマフィールドのリストにマッピングする方法を示しています。

検索システムのデータモデル設計では、ビジネスニーズを分析し、情報をスキーマで表現されたデータモデルに抽象化します。たとえば、テキストを検索するには、リテラル文字列を「埋め込み」によってベクトルに変換し、ベクトル検索を有効にして「インデックス化」する必要があります。この基本的な要件に加えて、公開タイムスタンプや著者などの他のプロパティを保存する必要がある場合があります。このメタデータにより、フィルタリングを通じてセマンティック検索を絞り込み、特定の日付以降に公開されたテキストや特定の著者によるテキストのみを返すことができます。また、これらのスカラーを本文とともに取得して、アプリケーションで検索結果をレンダリングできます。これらのテキスト断片を整理するために、各テキスト断片に一意の識別子を割り当て、整数または文字列として表現する必要があります。これらの要素は、高度な検索ロジックを実現するために不可欠です。
適切に設計されたスキーマを作成する方法については、スキーマ設計の実践 を参照してください。
スキーマを作成する
次のコードスニペットは、スキーマを作成する方法を示しています。
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- CSharp
- cURL
from pymilvus import MilvusClient, DataType
schema = MilvusClient.create_schema()
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.service.collection.request.CreateCollectionReq;
import io.milvus.v2.common.DataType;
import io.milvus.v2.service.collection.request.AddFieldReq;
CreateCollectionReq.CollectionSchema schema = MilvusClientV2.CreateSchema();
import "github.com/milvus-io/milvus/client/v3/entity"
schema := entity.NewSchema()
use milvus::v2::prelude::*;
let mut schema = CollectionSchema::new();
#include "milvus/MilvusClientV2.h"
milvus::CollectionSchemaPtr schema = std::make_shared<milvus::CollectionSchema>();
import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";
import { DataType } from "@zilliz/milvus2-sdk-node";
const schema = []
using Milvus.Client.V2.Types;
CollectionSchema schema = new();
export schema='{
"fields": []
}'
主キーフィールドを追加する
コレクション内の主キーフィールドは、エンティティを一意に識別します。Int64 または VarChar の値のみを受け入れます。次のコードスニペットは、主キーフィールドを追加する方法を示しています。
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- CSharp
- cURL
schema.add_field(
field_name="my_id",
datatype=DataType.INT64,
is_primary=True,
auto_id=False,
)
schema.addField(AddFieldReq.builder()
.fieldName("my_id")
.dataType(DataType.Int64)
.isPrimaryKey(true)
.autoID(false)
.build());
schema.WithField(entity.NewField().WithName("my_id").
WithDataType(entity.FieldTypeInt64).
WithIsPrimaryKey(true).
WithIsAutoID(false),
schema = schema.add_field(
FieldSchema::new()
.name("my_id")
.data_type(DataType::Int64)
.primary_key(true)
.auto_id(false),
);
schema->AddField(milvus::FieldSchema("my_id", milvus::DataType::INT64, "", true, false));
schema.push({
name: "my_id",
data_type: DataType.Int64,
is_primary_key: true,
autoID: false
});
schema.Fields.Add(new FieldSchema("my_id", DataType.Int64, isPrimaryKey: true));
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 に設定すると、データ挿入時に Zilliz Cloud が主キーフィールドの値を自動的に割り当てるようにできます。
手動で主キーを設定することが有益な場合を除き、すべての場合で autoId に依存することをお勧めします。
詳細については、主キーフィールドと AutoId を参照してください。
ベクトルフィールドを追加する
ベクトルフィールドは、さまざまな疎ベクトルおよび密ベクトルの埋め込みを受け入れます。Zilliz Cloud では、コレクションに 4 つのベクトルフィールドを追加できます。次のコードスニペットは、ベクトルフィールドを追加する方法を示しています。
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- CSharp
- cURL
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.WithField(entity.NewField().WithName("my_vector").
WithDataType(entity.FieldTypeFloatVector).
WithDim(5),
schema = schema.add_field(
FieldSchema::new()
.name("my_vector")
.data_type(DataType::FloatVector)
.dimension(5),
);
schema->AddField(milvus::FieldSchema("my_vector", milvus::DataType::FLOAT_VECTOR).WithDimension(5));
schema.push({
name: "my_vector",
data_type: DataType.FloatVector,
dim: 5
});
schema.Fields.Add(new FieldSchema("my_vector", DataType.FloatVector) { Dimension = 5 });
export vectorField='{
"fieldName": "my_vector",
"dataType": "FloatVector",
"elementTypeParams": {
"dim": 5
}
}'
export schema="{
\"autoID\": false,
\"fields\": [
$primaryField,
$vectorField
]
}"
上記のコードスニペットの dim パラメーターは、ベクトルフィールドに保持されるベクトル埋め込みの次元数を示します。FLOAT_VECTOR 値は、ベクトルフィールドが 32 ビット浮動小数点数のリストを保持することを示し、これらは通常、逆対数を表すために使用されます。さらに、Zilliz Cloud は次の種類のベクトル埋め込みもサポートしています。
-
FLOAT16_VECTORこのタイプのベクトルフィールドは、16 ビット半精度浮動小数点数のリストを保持し、通常、メモリまたは帯域幅が制限された深層学習や GPU ベースのコンピューティングシナリオに適しています。
-
BFLOAT16_VECTORこのタイプのベクトルフィールドは、精度は低いものの Float32 と同じ指数範囲を持つ 16 ビット浮動小数点数のリストを保持します。このタイプのデータは、精度に大きな影響を与えずにメモリ使用量を削減できるため、深層学習シナリオで一般的に使用されます。
-
INT8_VECTORこのタイプのベクトルフィールドは、8 ビット符号付き整数(int8)で構成されるベクトルを格納し、各コンポーネントの範囲は –128 から 127 です。ResNet や EfficientNet などの量子化深層学習アーキテクチャ向けに調整されており、精度の損失を最小限に抑えながら、モデルサイズを大幅に縮小し、推論速度を向上させます。注記: このベクトル型は HNSW インデックスでのみサポートされます。
-
BINARY_VECTORこのタイプのベクトルフィールドは、0 と 1 のリストを保持します。これらは、画像処理や情報検索のシナリオでデータを表すためのコンパクトな特徴として機能します。
-
SPARSE_FLOAT_VECTORこのタイプのベクトルフィールドは、非ゼロの数値とそのシーケンス番号のリストを保持し、疎ベクトル埋め込みを表します。
スカラーフィールドを追加する
一般的なケースでは、スカラーフィールドを使用して、Zilliz Cloud クラスターに格納されたベクトル埋め込みのメタデータを保存し、メタデータフィルタリングを使用した ANN 検索を実行して、検索結果の正確性を向上させることができます。Zilliz Cloud は、VarChar、TEXT、Boolean、Int、Float、Double など、複数のスカラーフィールドタイプをサポートしています。
VarChar フィールドを追加する
Zilliz Cloud クラスターでは、VarChar フィールドを使用して文字列を保存できます。VarChar フィールドの詳細については、文字列フィールド を参照してください。
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- CSharp
- cURL
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.WithField(entity.NewField().WithName("my_varchar").
WithDataType(entity.FieldTypeVarChar).
WithMaxLength(512),
schema = schema.add_field(
FieldSchema::new()
.name("my_varchar")
.data_type(DataType::VarChar)
.max_length(512),
);
schema->AddField(milvus::FieldSchema("my_varchar", milvus::DataType::VARCHAR).WithMaxLength(512));
schema.push({
name: "my_varchar",
data_type: DataType.VarChar,
max_length: 512
});
schema.Fields.Add(FieldSchema.CreateVarchar("my_varchar", 512));
export varCharField='{
"fieldName": "my_varchar",
"dataType": "VarChar",
"elementTypeParams": {
"max_length": 512
}
}'
export schema="{
\"autoID\": false,
\"fields\": [
$primaryField,
$vectorField,
$varCharField
]
}"
TEXT フィールドを追加する
Milvus 3.0 以降では、TEXT フィールドを使用して、ドキュメントのテキスト、パッセージ、ログ、その他の長いテキストコンテンツを保存できます。VARCHAR とは異なり、TEXT フィールドには max_length は必要ありません。TEXT フィールドの詳細については、TEXT フィールド を参照してください。
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- CSharp
- cURL
schema.add_field(
field_name="my_text",
datatype=DataType.TEXT,
)
schema.addField(AddFieldReq.builder()
.fieldName("my_text")
.dataType(DataType.Text)
.build());
schema.WithField(entity.NewField().WithName("my_text").
WithDataType(entity.FieldTypeText),
// Note: Not yet supported in milvus-sdk-rust as of v3.0.2.
schema->AddField(milvus::FieldSchema("my_text", milvus::DataType::TEXT));
schema.push({
name: "my_text",
data_type: DataType.Text
});
schema.Fields.Add(new FieldSchema("my_text", DataType.Text));
export textField='{
"fieldName": "my_text",
"dataType": "Text"
}'
export schema="{
\"autoID\": false,
\"fields\": [
$primaryField,
$vectorField,
$varCharField,
$textField
]
}"
数値フィールドを追加する
Zilliz Cloud がサポートする数値のタイプは、Int8、Int16、Int32、Int64、Float、Double です。数値フィールドの詳細については、数値フィールド を参照してください。
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- CSharp
- cURL
schema.add_field(
field_name="my_int64",
datatype=DataType.INT64,
)
schema.addField(AddFieldReq.builder()
.fieldName("my_int64")
.dataType(DataType.Int64)
.build());
schema.WithField(entity.NewField().WithName("my_int64").
WithDataType(entity.FieldTypeInt64),
schema = schema.add_field(
FieldSchema::new()
.name("my_int64")
.data_type(DataType::Int64),
);
schema->AddField(milvus::FieldSchema("my_int64", milvus::DataType::INT64));
schema.push({
name: "my_int64",
data_type: DataType.Int64,
});
schema.Fields.Add(new FieldSchema("my_int64", DataType.Int64));
export int64Field='{
"fieldName": "my_int64",
"dataType": "Int64"
}'
export schema="{
\"autoID\": false,
\"fields\": [
$primaryField,
$vectorField,
$varCharField,
$textField,
$int64Field
]
}"
ブールフィールドを追加する
Zilliz Cloud はブールフィールドをサポートしています。次のコードスニペットは、ブールフィールドを追加する方法を示しています。
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- CSharp
- cURL
schema.add_field(
field_name="my_bool",
datatype=DataType.BOOL,
)
schema.addField(AddFieldReq.builder()
.fieldName("my_bool")
.dataType(DataType.Bool)
.build());
schema.WithField(entity.NewField().WithName("my_bool").
WithDataType(entity.FieldTypeBool),
schema = schema.add_field(
FieldSchema::new()
.name("my_bool")
.data_type(DataType::Bool),
);
schema->AddField(milvus::FieldSchema("my_bool", milvus::DataType::BOOL));
schema.push({
name: "my_bool",
data_type: DataType.Bool
});
schema.Fields.Add(new FieldSchema("my_bool", DataType.Bool));
export boolField='{
"fieldName": "my_bool",
"dataType": "Bool"
}'
export schema="{
\"autoID\": false,
\"fields\": [
$primaryField,
$vectorField,
$varCharField,
$textField,
$int64Field,
$boolField
]
}"
複合フィールドを追加する
Zilliz Cloud では、複合フィールドとは、JSON フィールドのキーや配列フィールドのインデックスなど、より小さなサブフィールドに分割できるフィールドです。
JSON フィールドを追加する
JSON フィールドは通常、半構造化 JSON データを保存します。JSON フィールドの詳細については、JSON フィールドの概要 を参照してください。
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- CSharp
- cURL
schema.add_field(
field_name="my_json",
datatype=DataType.JSON,
)
schema.addField(AddFieldReq.builder()
.fieldName("my_json")
.dataType(DataType.JSON)
.build());
schema.WithField(entity.NewField().WithName("my_json").
WithDataType(entity.FieldTypeJSON),
schema = schema.add_field(
FieldSchema::new()
.name("my_json")
.data_type(DataType::Json),
);
schema->AddField(milvus::FieldSchema("my_json", milvus::DataType::JSON));
schema.push({
name: "my_json",
data_type: DataType.JSON,
});
schema.Fields.Add(new FieldSchema("my_json", DataType.Json));
export jsonField='{
"fieldName": "my_json",
"dataType": "JSON"
}'
export schema="{
\"autoID\": false,
\"fields\": [
$primaryField,
$vectorField,
$varCharField,
$textField,
$int64Field,
$boolField,
$jsonField
]
}"
配列フィールドを追加する
配列フィールドは要素のリストを保存します。配列フィールド内のすべての要素のデータタイプは同じである必要があります。配列フィールドの詳細については、配列フィールド を参照してください。
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- CSharp
- cURL
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.WithField(entity.NewField().WithName("my_array").
WithDataType(entity.FieldTypeArray).
WithElementType(entity.FieldTypeVarChar).
WithMaxLength(512).
WithMaxCapacity(5),
schema = schema.add_field(
FieldSchema::new()
.name("my_array")
.data_type(DataType::Array)
.element_type(DataType::VarChar)
.max_length(512)
.max_capacity(5),
);
schema->AddField(milvus::FieldSchema("my_array", milvus::DataType::ARRAY)
.WithElementType(milvus::DataType::VARCHAR)
.WithMaxCapacity(5)
.WithMaxLength(512));
schema.push({
name: "my_array",
data_type: DataType.Array,
element_type: DataType.VarChar,
max_capacity: 5,
max_length: 512
});
schema.Fields.Add(new FieldSchema("my_array", DataType.Array)
{
ElementDataType = DataType.VarChar,
MaxCapacity = 5,
MaxLength = 512
});
export arrayField='{
"fieldName": "my_array",
"dataType": "Array",
"elementDataType": "VarChar",
"elementTypeParams": {
"max_capacity": 5,
"max_length": 512
}
}'
export schema="{
\"autoID\": false,
\"fields\": [
$primaryField,
$vectorField,
$varCharField,
$textField,
$int64Field,
$boolField,
$jsonField,
$arrayField
]
}"