Valori predefiniti

Milvus consente di impostare valori predefiniti per i campi scalari (escluso il campo primario). Quando un campo ha un valore predefinito configurato, Milvus lo applica automaticamente se non vengono forniti dati durante l'inserimento.

I valori predefiniti semplificano la migrazione dei dati da altri sistemi di database a Milvus, conservando le impostazioni dei valori predefiniti esistenti. È inoltre possibile utilizzare i valori predefiniti per i campi i cui valori potrebbero essere incerti al momento dell'inserimento.

Limiti

  • Solo i campi scalari supportano i valori predefiniti. Il campo primario e i campi vettoriali non possono avere valori predefiniti.

  • JSON e ARRAY non supportano valori predefiniti.

  • I valori predefiniti possono essere configurati solo durante la creazione della raccolta e non possono essere modificati in seguito.

Impostazione dei valori predefiniti

Quando si crea una raccolta, utilizzare il parametro default_value in add_field() per definire il valore predefinito di un campo.

L'esempio seguente crea una collezione con due campi scalari che hanno valori predefiniti: age ha come valore predefinito 18 e status ha come valore predefinito "active".

from pymilvus import MilvusClient, DataType

client = MilvusClient(uri='http://localhost:19530')

# Define collection schema
schema = client.create_schema(
    auto_id=False,
    enable_dynamic_schema=True,
)

schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)
schema.add_field(field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=5)
schema.add_field(field_name="age", datatype=DataType.INT64, default_value=18)
schema.add_field(field_name="status", datatype=DataType.VARCHAR, default_value="active", max_length=10)

# Set index params
index_params = client.prepare_index_params()
index_params.add_index(field_name="vector", index_type="AUTOINDEX", metric_type="L2")

# Create collection
client.create_collection(collection_name="my_collection", schema=schema, index_params=index_params)
// java
// js
// go
# restful

Inserire entità

Quando si inseriscono i dati, se si omette un campo che ha un valore predefinito o lo si imposta esplicitamente a NULL, Milvus utilizza automaticamente il valore predefinito configurato.

data = [
    # All fields provided explicitly
    {"id": 1, "vector": [0.1, 0.2, 0.3, 0.4, 0.5], "age": 30, "status": "premium"},
    # age and status omitted → both use default values (18 and "active")
    {"id": 2, "vector": [0.2, 0.3, 0.4, 0.5, 0.6]},
    # status set to None → uses default value "active"
    {"id": 3, "vector": [0.3, 0.4, 0.5, 0.6, 0.7], "age": 25, "status": None},
    # age set to None → uses default value 18
    {"id": 4, "vector": [0.4, 0.5, 0.6, 0.7, 0.8], "age": None, "status": "inactive"}
]

client.insert(collection_name="my_collection", data=data)
// java
// js
// go
# restful

Ricerca e interrogazione con valori predefiniti

Le entità contenenti valori predefiniti si comportano come tutte le altre entità durante le ricerche vettoriali e i filtri scalari. È possibile filtrare in base ai valori predefiniti sia nelle operazioni search sia in quelle query.

L'esempio seguente cerca le entità in cui age è uguale al valore predefinito 18:

res = client.search(
    collection_name="my_collection",
    data=[[0.1, 0.2, 0.4, 0.3, 0.5]],
    search_params={"params": {"nprobe": 16}},
    filter="age == 18",
    limit=10,
    output_fields=["id", "age", "status"]
)

print("Search results (age == 18):")
for hit in res[0]:
    print(f"  id: {hit['id']}, age: {hit['entity']['age']}, status: {hit['entity']['status']}")
// java
// js
// go
# restful

Risultato atteso

Output:
Search results (age == 18):
  id: 2, age: 18, status: active
  id: 4, age: 18, status: inactive

È anche possibile interrogare le entità facendo corrispondere i valori predefiniti direttamente:

# Query entities where age equals the default value (18)
default_age_results = client.query(
    collection_name="my_collection",
    filter="age == 18",
    output_fields=["id", "age", "status"]
)

print("\nQuery results (age == 18):")
for r in default_age_results:
    print(f"  id: {r['id']}, age: {r['age']}, status: {r['status']}")

# Query entities where status equals the default value ("active")
default_status_results = client.query(
    collection_name="my_collection",
    filter='status == "active"',
    output_fields=["id", "age", "status"]
)

print("\nQuery results (status == 'active'):")
for r in default_status_results:
    print(f"  id: {r['id']}, age: {r['age']}, status: {r['status']}")
// java
// js
// go
# restful

Risultato atteso

Query results (age == 18):
  id: 2, age: 18, status: active
  id: 4, age: 18, status: inactive

Query results (status == 'active'):
  id: 2, age: 18, status: active
  id: 3, age: 25, status: active

Regole applicabili

Quando per un campo sono configurati sia nullable che default_value, le seguenti regole determinano il modo in cui Milvus gestisce l'input NULL o i valori mancanti del campo durante l'inserimento.

Nullabile

Valore predefinito

Inserimento da parte dell'utente

Risultato

✅ (non NULL)

NULL o omesso

Utilizza il valore predefinito

NULL o omesso

Memorizzato come NULL

✅ (non NULL)

NULL o omesso

Utilizza il valore predefinito

NULL o omesso

Lancia un errore

✅ (NULL)

NULL o omesso

Lancia un errore

Aspetti fondamentali:

  • Quando un campo ha un valore predefinito non NULL, tale valore viene utilizzato indipendentemente dal fatto che nullable sia abilitato.

  • Quando è impostato nullable=True ma non è impostato un valore predefinito, il campo memorizza NULL.

  • Quando nullable=False e nessun valore predefinito sono impostati, l'inserimento fallisce con un errore.

  • L'impostazione di un valore predefinito NULL su un campo non nullo non è valida e causa un errore.

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started
Feedback

Questa pagina è stata utile?