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.
JSONeARRAYnon 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
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
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
nullablesia abilitato.Quando è impostato
nullable=Truema non è impostato un valore predefinito, il campo memorizza NULL.Quando
nullable=Falsee 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.