メインコンテンツまでスキップ

StructArray フィールドを作成する

1 つの entity に順序付きの構造化要素リストを含める必要がある場合は、StructArray フィールドを作成します。StructArray フィールドは、要素型が Struct の Array フィールドです。各 Struct 要素は同じ schema に従い、scalar サブフィールド、vector サブフィールド、またはその両方を含めることができます。

このページでは、Struct schema を定義し、それを StructArray フィールドとして追加し、後で検索やフィルタリングに使用するサブフィールドを選択し、データを挿入またはインデックス作成する前に適用される schema ルールを理解する方法を説明します。

始める前に

このページでは、tech_articles という名前の collection を使用します。各 entity は 1 件の技術記事を表し、chunks フィールドには chunk レベルのデータが Struct 要素として格納されます。

FieldTypePurpose
doc_idINT64記事の主キー。
titleVARCHAR記事タイトル。
categoryVARCHAR記事レベルのカテゴリ。
title_vectorFLOAT_VECTOR記事レベルの vector フィールド。後のハイブリッド検索の例で使用します。
chunksARRAY<STRUCT>chunk レベルのテキスト、メタデータ、embedding を格納する StructArray フィールド。

chunks StructArray フィールドには、次のサブフィールドが含まれます。

SubfieldTypePurpose
textVARCHARchunk テキスト。
sectionVARCHARindexsearchfilter などのセクション名。
pageINT64ページ番号または chunk の論理位置。
quality_scoreFLOATscalar フィルタリングおよび範囲の例で使用する chunk レベルのスコア。
has_codeBOOLchunk にコードが含まれているかどうか。
emb_list_vectorFLOAT_VECTORMAX_SIM* メトリクスを使用する EmbeddingList 検索用の vector サブフィールド。
embFLOAT_VECTOR通常の vector メトリクスを使用する要素レベル検索用の vector サブフィールド。
📘Notes

vector フィールドまたは vector サブフィールドは、1 つのインデックスしか受け入れられません。EmbeddingList 検索と要素レベル検索の両方が必要な場合は、2 つの別々の vector サブフィールドを定義してください。この例では、chunks[emb_list_vector] は EmbeddingList 検索用、chunks[emb] は要素レベル検索用です。

サポートされるサブフィールドのデータ型

StructArray フィールドは、各 Struct サブフィールドに対して 1 つの配列値を格納します。Struct schema を定義する際は、サポートされている scalar 系および vector 系からサブフィールド型を選択してください。

Struct subfield physical typeSupportNotes
Array<Bool>Supportedサブフィールドを DataType.BOOL として定義します。
Array<Int8/Int16/Int32/Int64>Supportedサブフィールドを DataType.INT8DataType.INT16DataType.INT32、または DataType.INT64 として定義します。
Array<Float/Double>Supportedサブフィールドを DataType.FLOAT または DataType.DOUBLE として定義します。
Array<VarChar>Supportedサブフィールドを DataType.VARCHAR として定義し、max_length を設定します。
ArrayOfVector<FloatVector>Supportedサブフィールドを DataType.FLOAT_VECTOR として定義し、dim を設定します。
ArrayOfVector<Float16Vector>Supportedサブフィールドを DataType.FLOAT16_VECTOR として定義し、dim を設定します。
ArrayOfVector<BFloat16Vector>Supportedサブフィールドを DataType.BFLOAT16_VECTOR として定義し、dim を設定します。
ArrayOfVector<Int8Vector>Supportedサブフィールドを DataType.INT8_VECTOR として定義し、dim を設定します。
ArrayOfVector<BinaryVector>Supportedサブフィールドを DataType.BINARY_VECTOR として定義し、dim を設定します。
ArrayOfVector<SparseFloatVector>Not supportedStructArray フィールドでは sparse vector サブフィールドはサポートされていません。
Array<String>Not supportedString ではなく VARCHAR を使用してください。
Array<JSON>Not supportedStructArray フィールドでは JSON サブフィールドはサポートされていません。
Array<Geometry>Not supportedStructArray フィールドでは Geometry サブフィールドと GIS 関数はサポートされていません。
Array<Text>Not supportedStructArray フィールドでは Text サブフィールドはサポートされていません。
Array<Timestamptz>Not supportedStructArray フィールドでは Timestamptz サブフィールドと時刻固有の式はサポートされていません。
Nested Array, ArrayOfVector, Struct, or ArrayOfStructNot supportedStructArray フィールドには、ネストされた配列、ネストされた vector 配列、ネストされた Struct フィールド、またはネストされた Array-of-Struct フィールドを含めることはできません。

バージョン固有のサポート、nullable の動作、およびその他の制限については、StructArray Limits を参照してください。

StructArray フィールドを持つ collection を作成する

StructArray フィールドを作成するには、まず各要素で使用する Struct schema を定義します。次に、Array フィールドを追加し、その要素型を Struct に設定します。

  1. collection schema を作成します。

  2. 主キーや記事レベルのフィールドなど、collection レベルのフィールドを追加します。

  3. StructArray フィールド内に格納される要素用の Struct schema を作成します。

  4. Struct schema に scalar サブフィールドと vector サブフィールドを追加します。

  5. element_type=DataType.STRUCT を指定した Array フィールドを追加します。

  6. struct_schema を Struct schema に設定します。

  7. max_capacity を設定して、各 entity がそのフィールドに格納できる Struct 要素数を制限します。

python
from pymilvus import MilvusClient, DataType

client = MilvusClient(
uri="YOUR_CLUSTER_ENDPOINT",
token="YOUR_CLUSTER_TOKEN",
)

schema = client.create_schema(
auto_id=False,
enable_dynamic_field=False,
)

# Collection-level fields.
schema.add_field(
field_name="doc_id",
datatype=DataType.INT64,
is_primary=True,
)
schema.add_field(
field_name="title",
datatype=DataType.VARCHAR,
max_length=512,
)
schema.add_field(
field_name="category",
datatype=DataType.VARCHAR,
max_length=128,
)
schema.add_field(
field_name="title_vector",
datatype=DataType.FLOAT_VECTOR,
dim=4,
)

# Struct schema used by each element in the StructArray field.
chunk_schema = client.create_struct_field_schema()
chunk_schema.add_field(
field_name="text",
datatype=DataType.VARCHAR,
max_length=65535,
)
chunk_schema.add_field(
field_name="section",
datatype=DataType.VARCHAR,
max_length=128,
)
chunk_schema.add_field(
field_name="page",
datatype=DataType.INT64,
)
chunk_schema.add_field(
field_name="quality_score",
datatype=DataType.FLOAT,
)
chunk_schema.add_field(
field_name="has_code",
datatype=DataType.BOOL,
)

# Vector subfield for EmbeddingList search.
chunk_schema.add_field(
field_name="emb_list_vector",
datatype=DataType.FLOAT_VECTOR,
dim=4,
)

# Vector subfield for element-level search.
chunk_schema.add_field(
field_name="emb",
datatype=DataType.FLOAT_VECTOR,
dim=4,
)

# Add the StructArray field.
schema.add_field(
field_name="chunks",
datatype=DataType.ARRAY,
element_type=DataType.STRUCT,
struct_schema=chunk_schema,
max_capacity=1000,
)

client.create_collection(
collection_name="tech_articles",
schema=schema,
)

StructArray フィールドパスを理解する

StructArray フィールドを作成した後は、structArray[subfield] のパス構文でそのサブフィールドを参照します。この構文は、インデックスの作成、vector サブフィールドの検索、サブフィールドの出力、scalar フィルタの構築に使用します。

PathMeaningCommon usage
chunks[text]各 Struct 要素内の text サブフィールド。出力フィールドまたは scalar フィルタリング。
chunks[section]各 chunk のセクションラベル。scalar フィルタリング。
chunks[quality_score]chunk レベルの quality score。scalar フィルタリングまたは scalar インデックス。
chunks[emb_list_vector]embedding list として使用される vector サブフィールド。MAX_SIM* を使用する EmbeddingList 検索。
chunks[emb]各 Struct 要素によって独立して使用される vector サブフィールド。要素レベルの vector 検索。

StructArray フィールドを nullable にする

Milvus v3.0.x と互換性のある cluster では、nullable な StructArray フィールドがサポートされます。nullable な StructArray フィールドでは、entity は StructArray フィールド全体に対して null を格納できます。

python
schema.add_field(
field_name="chunks",
datatype=DataType.ARRAY,
element_type=DataType.STRUCT,
struct_schema=chunk_schema,
max_capacity=1000,
nullable=True,
)
🚧Warning

nullable な StructArray フィールドは、Milvus v3.0.x と互換性のある cluster でのみ利用できます。nullable な StructArray フィールドでは、entity は有効な StructArray 値を指定するか、フィールド全体を null に設定できます。有効な StructArray 値を挿入する場合、すべてのサブフィールドは null であるか、有効な値を持っている必要があります。一部のサブフィールドを null にし、他を有効な値にした entity を挿入するとエラーになります。詳細については、StructArray Limits を参照してください。

既存の collection に StructArray フィールドを追加する

Milvus v3.0.x と互換性のある cluster では、既存の collection に StructArray フィールドを追加できます。追加する StructArray フィールドは nullable である必要があります。これは、collection 内にすでに存在する entity が新しいフィールドの値を持たないためです。

既存の collection に StructArray フィールドを追加するには、まず Struct schema を定義します。次に add_collection_struct_field() を呼び出し、nullable=True を設定します。

python
chunk_schema = client.create_struct_field_schema()
chunk_schema.add_field(
field_name="text",
datatype=DataType.VARCHAR,
max_length=65535,
)
chunk_schema.add_field(
field_name="section",
datatype=DataType.VARCHAR,
max_length=128,
)
chunk_schema.add_field(
field_name="page",
datatype=DataType.INT64,
)
chunk_schema.add_field(
field_name="quality_score",
datatype=DataType.FLOAT,
)
chunk_schema.add_field(
field_name="has_code",
datatype=DataType.BOOL,
)
chunk_schema.add_field(
field_name="emb_list_vector",
datatype=DataType.FLOAT_VECTOR,
dim=4,
)
chunk_schema.add_field(
field_name="emb",
datatype=DataType.FLOAT_VECTOR,
dim=4,
)

client.add_collection_struct_field(
collection_name="tech_articles",
field_name="chunks",
struct_schema=chunk_schema,
max_capacity=1000,
nullable=True,
)

StructArray フィールドが追加されると、既存の entity はその新しいフィールドのすべてのサブフィールドにわたって null を返します。

StructArray フィールドが作成された後は、その既存の StructArray フィールドに新しいサブフィールドを追加することはできません。後で要素属性を追加する必要がある場合は、drop_collection_field() を呼び出して StructArray フィールドを削除し、更新した Struct schema で新しい StructArray フィールドを追加してください。

python
client.drop_collection_field(
collection_name="tech_articles",
field_name="chunks",
)

client.add_collection_struct_field(
collection_name="tech_articles",
field_name="chunks",
struct_schema=updated_chunk_schema,
max_capacity=1000,
nullable=True,
)

Schema ルール

RuleExplanation
Struct is used as an Array element type.StructArray フィールドは、element_type=STRUCT を持つ Array フィールドとして作成します。Struct を collection のトップレベルフィールドとして作成しないでください。
All elements share one schema.同じ StructArray フィールド内のすべての Struct 要素は、そのフィールド用に定義された Struct schema に従います。
max_capacity is required.これは、各 entity が StructArray フィールドに格納できる Struct 要素数を制限します。
Only supported subfield types are allowed.StructArray でサポートされている scalar および vector のサブフィールド型を使用してください。JSON、Geometry、Text、Timestamptz、SparseFloatVector、またはネストされた Struct / Array サブフィールドは定義しないでください。
Vector subfields need indexes before search.vector 検索を実行する前に、chunks[emb_list_vector]chunks[emb] のようなパスにインデックスを作成してください。
One vector subfield has one index.EmbeddingList 検索と要素レベル検索の両方が必要な場合は、2 つの別々の vector サブフィールドを作成してください。
Existing StructArray subfields are fixed.StructArray フィールドを作成した後、その同じ StructArray フィールドにさらにサブフィールドを追加できるとは考えないでください。
Functions are not supported inside Struct.StructArray フィールド内のフィールドまたはサブフィールドに対して function を定義しないでください。
Scalar subfields should match filter needs.sectionquality_scorehas_code などのフィールドは、後でそれらをフィルタリング、グループ化、または出力する必要がある場合にのみ追加してください。

よくある間違い

  • DataType.STRUCT を、Array フィールドの要素型として使用する代わりに collection のトップレベルフィールドとして作成してしまう。

  • StructArray フィールドに max_capacity を設定し忘れる。

  • JSON、Geometry、Text、Timestamptz、SparseFloatVector、ネストされた Array、ネストされた Struct、または Array-of-Struct など、サポートされていないサブフィールド型を定義してしまう。

  • サブフィールド型として String を使用してしまう。VARCHAR を使用し、max_length を設定してください。

  • 1 つの vector サブフィールドを EmbeddingList 検索と要素レベル検索の両方に使用してしまう。

  • vector サブフィールドだけを追加し、sectionquality_scorehas_code など、フィルタリングに必要な scalar サブフィールドを追加し忘れる。

  • vector サブフィールドを $[...] scalar predicate 入力として扱ってしまう。vector サブフィールドは vector 検索に、scalar サブフィールドは scalar predicate に使用してください。

  • フィールド作成後に、既存の StructArray フィールドへ新しいサブフィールドを追加できると思い込んでしまう。

  • 必須のパス構文 chunks[emb] または chunks[emb_list_vector] の代わりに chunks.emb または chunks.emb_list_vector を使用してしまう。

  • nullable な StructArray の動作が、すべての対象バージョンで利用可能だと考えてしまう。

次のステップ

  1. StructArray フィールドにネストされたデータを挿入するには、Insert Data into StructArray Fields を参照してください。

  2. vector インデックスと scalar インデックスを作成するには、Index StructArray Fields を参照してください。

  3. StructArray の vector サブフィールドを検索するには、Basic Vector Search with StructArray を参照してください。

  4. サポートされるデータ型、nullable の動作、バージョン固有の制限を確認するには、StructArray Limits を参照してください。

Ctrl I