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

NULL 許容フィールド

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

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

  • 値の欠落を許容する外部システムからデータを取り込みます。
  • 一部のメタデータは任意であるか、データセットの一部でのみ利用可能です。
  • ベクトル埋め込みは非同期で生成され、後から挿入されます。

制限​

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

  • Zilliz Cloud では、NULL 許容の StructArray フィールドは Dedicated クラスターおよび On-Demand クラスターでサポートされています。nullable=True は個々のサブフィールドではなく、親の StructArray フィールドに設定します。NULL は個々の Struct 要素ではなく、StructArray フィールド全体に適用され、親の設定は内部的にサブフィールドへ伝播されます。既存のコレクションに追加する StructArray フィールドは NULL 許容である必要があり、これにより既存のエンティティは新しいフィールドに対して NULL を返すことができます。要素レベルの null 値は、Milvus v3.0.x と互換性のある Dedicated クラスターでサポートされていますが、On-Demand クラスターではまだ利用できません。詳細は、StructArray Limits を参照してください。

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

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

NULL 許容フィールドとは​

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

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

  • 入力エンティティからフィールドが省略されます。
  • フィールドが明示的に NULL に設定されます(たとえば、Python の None)。

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

nullable 属性は、コレクションスキーマ内のスカラーフィールドとベクトルフィールドの両方でサポートされています。Dedicated クラスターおよび On-Demand クラスターでは、親の StructArray フィールドでもサポートされています。Struct のサブフィールドを個別に NULL 許容として構成しないでください。StructArray の親で NULL 許容性を定義すると、その設定は内部的にサブフィールドへ伝播されます。要素レベルの null 値は、Milvus v3.0.x と互換性のある Dedicated クラスターでサポートされていますが、On-Demand クラスターではまだ利用できません。

📘Notes

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

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

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

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

この例では、コレクションスキーマで 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 に設定されることを許可します。

次の例では、コレクションスキーマで NULL 許容フィールドを定義する で作成したコレクションに 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")

この時点で、次のようになります。

  • 有効な埋め込み値を持つエンティティはインデックスに登録され、検索可能になります。
  • 埋め込みが 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,
search_params={"metric_type": "COSINE"},
output_fields=["embedding"],
)

print(res)

この検索では、次のようになります。

  • 非 NULL の embedding 値を持つエンティティのみが候補として考慮されます。
  • embedding が NULL 値のエンティティは評価から除外されます。
  • 返される結果の数は、コレクション内に存在する有効なベクトルの数によって決まります。

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

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

スカラーフィールドは nullable=True で定義でき、ベクトルフィールドと同じ取り込みルールに従います。ただし、NULL のスカラー値はフィルター式で常に false と評価されます。スカラーフィールドが NULL かどうかでエンティティを選択するには、IS NULL または IS NOT NULL を使用します。

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

python
expr = "age > 18"

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

同様に、等価チェックは NULL 値に一致しません。例は以下の通りです。

python
expr = 'status == "active"'

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

NULL 許容フィールドとデフォルト値​

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

NULL 許容が有効デフォルト値ユーザー入力(NULL または省略)結果
はいはい(非 NULL)NULL または省略デフォルト値を使用します。
はいいいえNULL または省略NULL として格納します。
いいえはい(非 NULL)NULL または省略デフォルト値を使用します。
いいえいいえNULL または省略エラーをスローします。
いいえはい(NULL デフォルト)NULL または省略エラーをスローします。

主なポイント:

  • フィールドに非 NULL のデフォルト値がある場合、nullable が有効かどうかに関係なく、その値が使用されます。
  • nullable=True でデフォルト値が設定されていない場合、フィールドには NULL が格納されます。
  • nullable=False でデフォルト値が設定されていない場合、挿入はエラーで失敗します。
  • NULL 以外を許容しないフィールドに NULL のデフォルト値を設定することは無効であり、エラーの原因になります。

デフォルト値の完全な例と API の使用方法については、デフォルト値 を参照してください。