Значения по умолчанию
Milvus позволяет устанавливать значения по умолчанию для скалярных полей (за исключением первичного поля). Если для поля задано значение по умолчанию, Milvus автоматически применяет это значение, если при вставке не было предоставлено никаких данных.
Значения по умолчанию упрощают миграцию данных из других систем баз данных в Milvus, сохраняя существующие настройки значений по умолчанию. Вы также можете использовать значения по умолчанию для полей, значения которых могут быть неопределенными на момент вставки.
Ограничения
Только скалярные поля поддерживают значения по умолчанию. Первичное поле и векторные поля не могут иметь значения по умолчанию.
JSONи поляARRAYне поддерживают значения по умолчанию.Значения по умолчанию можно настроить только во время создания коллекции и не могут быть изменены впоследствии.
Установка значений по умолчанию
При создании коллекции используйте параметр default_value в add_field(), чтобы определить значение по умолчанию для поля.
В следующем примере создается коллекция с двумя скалярными полями, имеющими значения по умолчанию: age по умолчанию равно 18, а status по умолчанию равно "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
Вставка сущностей
При вставке данных, если вы опустите поле, имеющее значение по умолчанию, или явно установите для него значение NULL, Milvus автоматически использует настроенное значение по умолчанию.
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
Поиск и запрос со значениями по умолчанию
Сущности, содержащие значения по умолчанию, ведут себя так же, как и любые другие сущности, при векторном поиске и скалярной фильтрации. Вы можете фильтровать по значениям по умолчанию в операциях search и query.
Следующий пример ищет сущности, в которых age равно значению по умолчанию 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
Вы также можете запрашивать сущности, напрямую сопоставляя значения по умолчанию:
# 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
Применимые правила
Когда для поля настроены оба параметра nullable и default_value, следующие правила определяют, как Milvus обрабатывает ввод NULL или отсутствующие значения поля при вставке.
Nullable |
Значение по умолчанию |
Ввод пользователя |
Результат |
|---|---|---|---|
✅ |
✅ (не NULL) |
NULL или опущено |
Использует значение по умолчанию |
✅ |
❌ |
NULL или опущено |
Хранится как NULL |
❌ |
✅ (не NULL) |
NULL или опущено |
Использует значение по умолчанию |
❌ |
❌ |
NULL или опущено |
Выбрасывает ошибку |
❌ |
✅ (NULL) |
NULL или опущено |
Выбрасывает ошибку |
Основные выводы:
Если поле имеет не NULL-значение по умолчанию, это значение используется независимо от того, включен ли
nullable.Если включен
nullable=True, но не установлено значение по умолчанию, в поле сохраняется NULL.Если
nullable=Falseи значение по умолчанию не установлено, вставка завершится с ошибкой.Установка значения по умолчанию NULL для поля, не являющегося нулевым, недействительна и приводит к ошибке.