Значения по умолчанию

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 для поля, не являющегося нулевым, недействительна и приводит к ошибке.

Попробуйте Managed Milvus бесплатно

Zilliz Cloud работает без проблем, поддерживается Milvus и в 10 раз быстрее.

Начать
Обратная связь

Была ли эта страница полезной?