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

Nullable フィールド

Zilliz Cloud は nullable フィールドをサポートしています。nullable フィールドでは、フィールド値を欠落させるか、明示的に NULL に設定できます。nullability はスキーマレベルで定義され、データ取り込み、インデックス作成、検索、クエリ操作に一貫して適用されます。

nullable フィールドは、次のような場合に使用します。

  • 欠損値を許容する外部システムからデータを取り込む場合

  • 一部のメタデータが任意である、またはデータセットの一部にしか存在しない場合

  • ベクトル埋め込みが非同期で生成され、後から挿入される場合

制限

  • NULL 値を許可するベクトルフィールドでは、IS NULL または IS NOT NULL フィルター式はサポートされていません。ベクトルフィールド値が NULL かどうかに基づいてエンティティを明示的にフィルタリングすることはできません。

  • Zilliz Cloud では、nullable な StructArray フィールドは、3.0.x 系の Milvus 3.0.0 以降を実行する On-Demand クラスターでサポートされています。Serving クラスターでは、nullable な StructArray フィールドはサポートされていません。nullable=True は、個々のサブフィールドではなく、親の StructArray フィールドに設定します。NULL は StructArray フィールド全体に適用され、個々の Struct 要素には適用されません。また、親の設定は内部的にそのサブフィールドに伝播されます。既存のコレクションに追加する StructArray フィールドは nullable である必要があり、これにより既存のエンティティは新しいフィールドに対して NULL を返すことができます。詳細は、StructArray の制限 を参照してください。

  • nullable 属性はフィールドの作成時に定義され、後から変更することはできません。既存のフィールドに対して nullability を有効化または無効化することはできません。

  • nullable としてマークされたフィールドは、partition key として使用できません。partition key フィールドには、常に有効な非 NULL 値が含まれている必要があります。

nullable フィールドとは何ですか?

Zilliz Cloud では、フィールドに NULL 値を保存できるかどうかは、nullable というスキーマレベルのフィールド属性によって制御されます。

フィールドが nullable=True で定義されている場合、Zilliz Cloud はデータ取り込み時にフィールド値が欠落していても許可します。実際には、Zilliz Cloud は次の 2 つの入力を同等として扱い、フィールド値を NULL として保存します。

  • 入力エンティティからそのフィールドが省略されている

  • フィールドが明示的に NULL に設定されている(たとえば Python の None

フィールドが nullable として定義されていない場合(デフォルトの動作)、すべてのエンティティはそのフィールドに有効な値を指定する必要があります。フィールドを省略するか、明示的に NULL 値を割り当てると、挿入またはインポート操作は失敗します。

nullable 属性は、コレクションスキーマ内のスカラーフィールドとベクトルフィールドの両方でサポートされています。サポート対象の On-Demand クラスターでは、親の StructArray フィールドでもサポートされています。Struct のサブフィールドを個別に nullable として設定しないでください。nullability は StructArray の親で定義し、その設定は内部的にサブフィールドに伝播されます。

📘Notes

nullability は、フィールド値が欠落していてもよいかどうかを決定するものであり、フィールドが欠落している場合にどの値が使用されるかを定義するものではありません。

  • nullable フィールドがデフォルト値なしで設定されている場合、そのフィールドを省略すると NULL 値が保存されます。

  • デフォルト値が設定されている場合、Zilliz Cloud は代わりにそのデフォルト値を保存することがあります。詳細は、デフォルト値 を参照してください。

コレクションスキーマで nullable フィールドを定義する

nullable フィールドを使用するには、コレクションスキーマを定義するときに nullable 属性を有効にする必要があります。

この例では、コレクションスキーマで embedding という名前のベクトルフィールドを nullable=True で定義しています。これにより、コレクション内のエンティティは、データ取り込み時にベクトル値を省略したり、明示的に NULL に設定したりできます。

python
from pymilvus import MilvusClient, DataType

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

# Define schema fields
schema = client.create_schema()
schema.add_field("id", DataType.INT64, is_primary=True) # Primary field
schema.add_field(
field_name="embedding",
datatype=DataType.FLOAT_VECTOR,
dim=4,
nullable=True, # Enable the nullable attribute; defaults to False
)

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

このスキーマでは、次のようになります。

  • embedding フィールドは明示的に nullable としてマークされています。

  • エンティティは、挿入時に embedding フィールドを省略したり、NULL 値を割り当てたりできます。

  • NULL 値を許可するかどうかは、コレクションの作成時に確定します。

わかりやすくするため、以降の例では nullable なベクトルフィールド(embedding)に焦点を当てます。nullable なスカラーフィールドの定義は任意であり、このガイドの残りの手順を進めるうえで必須ではありません。

任意: nullable なスカラーフィールドを定義する

スカラーフィールドも、同じ nullable 属性を使用して nullable として定義でき、取り込み時には同じルールに従います。たとえば、次のとおりです。

python
schema.add_field(
field_name="age",
datatype=DataType.INT64,
nullable=True,
)

値の欠落または NULL がある場合の挿入動作

コレクションスキーマでフィールドが nullable として定義されると、Zilliz Cloud はデータ取り込み時にそのフィールド値が欠落していること、または明示的に NULL に設定されていることを許可します。

次の例では、手順 1 で作成したコレクションに 3 つのエンティティを挿入し、これらの異なるケースを示します。

python
data = [
{
"id": 1,
"embedding": [0.1, 0.2, 0.3, 0.4],
},
{
"id": 2,
"embedding": None, # Explicitly set to NULL
},
{
"id": 3, # Field omitted → stored as NULL
},
]

client.insert(
collection_name="my_collection",
data=data,
)

この例では、次のとおりです。

  • エンティティ id = 1 は有効なベクトル値を指定しています。

  • エンティティ id = 2 は、embedding フィールドに明示的に NULL 値を割り当てています。

  • エンティティ id = 3 は embedding フィールドを完全に省略しています。Zilliz Cloud はそれを NULL として保存します。

nullable フィールドのインデックス動作

データを挿入した後は、通常どおり nullable フィールドにインデックスを構築できます。主な違いは、インデックス構築時に Zilliz Cloud が NULL 値をどのように処理するかです。

  • 非 NULL 値を持つエンティティのみがインデックスに追加されます。

  • NULL 値を持つエンティティはスキップされ、インデックス構築には関与しません。

nullable なベクトルフィールドの場合、これは有効なベクトルを持つエンティティのみがベクトル類似度による検索の対象になることを意味します。

python
# Set index parameters
index_params = client.prepare_index_params()
index_params.add_index(
field_name="embedding",
index_type="AUTOINDEX",
metric_type="COSINE",
)

# Create index
client.create_index(
collection_name="my_collection",
index_params=index_params,
)

# Load collection for future search operations
client.load_collection(collection_name="my_collection")

この時点では、次のとおりです。

  • 有効な embedding 値を持つエンティティはインデックスに登録され、検索できる状態になります。

  • embedding が NULL のエンティティはコレクションに残りますが、ベクトルインデックスには含まれません。

nullable フィールドの検索動作

nullable フィールドに対して検索操作を実行すると、Zilliz Cloud は検索で使用するフィールドに非 NULL 値を持つエンティティのみを評価します。ベクトルフィールドが NULL のエンティティは自動的にスキップされます。

この例の embedding のような nullable なベクトルフィールドの場合、次のとおりです。

  • 有効なベクトル値を持つエンティティのみが評価され、ランク付けされます。

  • NULL ベクトルを持つエンティティがエラーの原因になることはありません。

  • 有効なベクトルの数が要求された topK(limit)より少ない場合、Zilliz Cloud は limit より少ない結果を返すことがあります。

次の例では、nullable なベクトルフィールド embedding に対してベクトル検索を実行します。

python
res = client.search(
collection_name="my_collection",
data=[[0.1, 0.2, 0.3, 0.4]],
anns_field="embedding",
limit=3,
output_fields=["embedding"],
)

print(res)

この検索では、次のとおりです。

  • 非 NULL の embedding 値を持つエンティティのみが候補として考慮されます。

  • embedding が NULL 値のエンティティは、評価から除外されます。

  • 返される結果の数は、コレクション内に存在する有効なベクトルの数によって決まります。

クエリとフィルタリングへの影響

これまでの例ではベクトルフィールドに焦点を当ててきました。このセクションでは、スカラーフィルター式における NULL 値の動作について説明します。

スカラーフィールドは nullable=True で定義でき、ベクトルフィールドと同じ取り込みルールに従います。ただし、フィルター式では NULL のスカラー値は常に false と評価されます

たとえば、nullable なスカラーフィールド age の場合、次のフィルターは age が 18 より大きいエンティティを選択します。

python
expr = "age > 18"

age が NULL のエンティティは、NULL 値がフィルター条件を満たさないため、結果から除外されます。

同様に、等価比較は NULL 値と一致しません。たとえば、次のとおりです。

python
expr = "status == \"active\""

status が NULL のエンティティは、結果から除外されます。

適用ルール

あるフィールドに nullabledefault_value の両方が設定されている場合、挿入時に NULL 入力またはフィールド値の欠落を Zilliz Cloud がどのように処理するかは、次のルールによって決まります。

Nullableデフォルト値ユーザー入力結果
(非 NULL)NULL または省略デフォルト値を使用
NULL または省略NULL として保存
(非 NULL)NULL または省略デフォルト値を使用
NULL または省略エラーをスロー
(NULL)NULL または省略エラーをスロー

重要なポイント:

  • フィールドに非 NULL のデフォルト値がある場合、nullable が有効かどうかに関係なく、その値が使用されます。

  • nullable=True でデフォルト値が設定されていない場合、そのフィールドには NULL が保存されます。

  • nullable=False でデフォルト値が設定されていない場合、挿入はエラーで失敗します。

  • NULL 不可のフィールドに NULL のデフォルト値を設定することは無効であり、エラーの原因となります。