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

NULL 許容フィールド

Zilliz Cloud は NULL 許容フィールドをサポートしており、フィールド値を省略したり明示的に NULL に設定したりできます。NULL 許容性はスキーマレベルで定義され、データの取り込み、インデックス作成、検索、クエリの各操作で一貫して適用されます。

NULL 許容フィールドは、次の場合に使用します。

  • 値の欠落が許容される外部システムからデータを取り込む場合

  • 一部のメタデータが任意である、またはデータセットの一部でのみ使用できる場合

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

制限事項​

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

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

  • NULL 許容としてマークされたフィールドは、パーティションキーとして使用できません。パーティションキーフィールドには、常に有効な非 NULL 値を含める必要があります。

NULL 許容フィールドとは​

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

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

  • 入力エンティティからフィールドを省略する

  • フィールドを明示的に NULL に設定する(たとえば Python の None)

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

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

Notes

NULL 許容性は、フィールド値が欠落する可能性があるかどうかを決定しますが、フィールドが欠落しているときにどの値が使用されるかは定義しません。

  • NULL 許容フィールドにデフォルト値が構成されていない場合、フィールドを省略すると NULL 値が格納されます。

  • デフォルト値が構成されている場合、Zilliz Cloud は代わりにデフォルト値を格納することがあります。詳細は、デフォルト値 を参照してください。

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

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

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

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

  • NULL 値を許容するかどうかは、コレクションの作成時に固定されます。

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

任意:NULL 許容のスカラーフィールドを定義する

スカラーフィールドも、同じ nullable 属性を使用して NULL 許容として定義でき、取り込み時には同じルールに従います。次に例を示します。

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

値の欠落または NULL を含む場合の挿入動作​

コレクションスキーマでフィールドが NULL 許容として定義されると、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 として格納します。

NULL 許容フィールドのインデックス動作​

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

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

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

NULL 許容のベクトルフィールドでは、有効なベクトルを持つエンティティのみがベクトル類似度検索の対象になります。

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 であるエンティティはコレクションに残りますが、ベクトルインデックスには含まれません。

NULL 許容フィールドの検索動作​

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

この例の embedding のような NULL 許容のベクトルフィールドでは、次のとおりです。

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

  • NULL ベクトルを持つエンティティはエラーを引き起こしません。

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

次の例では、NULL 許容のベクトルフィールド 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 で定義でき、ベクトルフィールドと同じ取り込みルールに従います。age > 18 や status == "active" のような通常の比較フィルターは NULL 値に一致しません。サポート対象のフィールドが NULL かどうかに基づいてエンティティを明示的に選択するには、IS NULL または IS NOT NULL を使用します。

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

python
expr = "age > 18"

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

同様に、等価チェックも NULL 値には一致しません。次に例を示します。

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

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

適用されるルール​

フィールドに nullable と default_value の両方が構成されている場合、挿入時に Zilliz Cloud が NULL 入力またはフィールド値の欠落をどのように処理するかは、次のルールで決まります。

NULL 許容デフォルト値ユーザー入力結果
(非 NULL)NULL または省略デフォルト値が使用されます。
NULL または省略NULL として格納されます。
(非 NULL)NULL または省略デフォルト値が使用されます。
NULL または省略エラーが発生します。
(NULL)NULL または省略エラーが発生します。

主なポイント:

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

  • nullable=True でデフォルト値が設定されていない場合、フィールドは NULL を格納します。

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

  • NULL を許容しないフィールドに NULL のデフォルト値を設定することは無効であり、エラーが発生します。