스키마 관리
이 항목에서는 Milvus의 스키마에 대해 소개합니다. 스키마는 컬렉션의 속성과 그 안의 필드를 정의하는 데 사용됩니다.
필드 스키마
필드 스키마는 필드의 논리적 정의입니다. 컬렉션 스키마를 정의하고 컬렉션을 관리하기 전에 가장 먼저 정의해야 하는 항목입니다.
Milvus는 컬렉션에서 하나의 기본 키 필드만 지원합니다.
필드 스키마 속성
속성 | 설명 | 참고 |
---|---|---|
name |
생성할 컬렉션의 필드 이름 | 데이터 유형입니다: 문자열 필수 |
dtype |
필드의 데이터 유형 | 필수 |
description |
필드에 대한 설명 | 데이터 유형: 문자열 선택 사항 |
is_primary |
필드를 기본 키 필드로 설정할지 여부입니다. | 데이터 유형: 부울 (true 또는 false ).기본 키 필드의 경우 필수입니다. |
auto_id (기본 키 필드의 경우 필수) |
자동 ID(기본 키) 할당을 사용하거나 사용하지 않도록 전환합니다. | True 또는 False |
max_length (VARCHAR 필드에 필수) |
삽입할 수 있는 문자열의 최대 바이트 길이입니다. 멀티바이트 문자(예: 유니코드 문자)는 각각 1바이트 이상을 차지할 수 있으므로 삽입된 문자열의 바이트 길이가 지정된 제한을 초과하지 않도록 주의하세요. | [1, 65,535] |
dim |
벡터의 차원 | 데이터 유형: 정수 ∈[1, 32768] 밀집 벡터 필드의 경우 필수입니다. 스파스 벡터 필드의 경우 생략합니다. |
is_partition_key |
이 필드가 파티션 키 필드인지 여부입니다. | 데이터 유형: 부울(true 또는 false ). |
필드 스키마 만들기
데이터 삽입의 복잡성을 줄이기 위해 Milvus에서는 필드 스키마를 생성하는 동안 기본 키 필드를 제외한 각 스칼라 필드에 대해 기본값을 지정할 수 있습니다. 즉, 데이터를 삽입할 때 필드를 비워두면 이 필드에 지정한 기본값이 적용됩니다.
일반 필드 스키마를 만듭니다:
from pymilvus import DataType, FieldSchema
id_field = FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, description="primary id")
age_field = FieldSchema(name="age", dtype=DataType.INT64, description="age")
embedding_field = FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=128, description="vector")
# The following creates a field and use it as the partition key
position_field = FieldSchema(name="position", dtype=DataType.VARCHAR, max_length=256, is_partition_key=True)
기본 필드 값을 사용하여 필드 스키마를 생성합니다:
from pymilvus import DataType, FieldSchema
fields = [
FieldSchema(name="id", dtype=DataType.INT64, is_primary=True),
# configure default value `25` for field `age`
FieldSchema(name="age", dtype=DataType.INT64, default_value=25, description="age"),
embedding_field = FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=128, description="vector")
]
지원되는 데이터 유형
DataType
은 필드에 포함된 데이터의 종류를 정의합니다. 필드마다 지원되는 데이터 유형이 다릅니다.
기본 키 필드 지원
- INT64: numpy.int64
- varchar: varchar
스칼라 필드 지원:
- BOOL: 부울(
true
또는false
) - INT8: numpy.int8
- INT16: numpy.int16
- INT32: numpy.int32
- INT64: numpy.int64
- FLOAT: numpy.float32
- DOUBLE: numpy.double
- VARCHAR: VARCHAR
- JSON: JSON
- Array: 배열
복합 데이터 유형으로 JSON을 사용할 수 있습니다. JSON 필드는 키-값 쌍으로 구성됩니다. 각 키는 문자열이고 값은 숫자, 문자열, 부울 값, 배열 또는 목록일 수 있습니다. 자세한 내용은 JSON: 새로운 데이터 유형을 참조하세요.
- BOOL: 부울(
벡터 필드 지원
- 바이너리_벡터: 이진 데이터를 0과 1의 시퀀스로 저장하며, 이미지 처리 및 정보 검색에서 특징을 간결하게 표현하는 데 사용됩니다.
- FLOAT_VECTOR: 과학 컴퓨팅 및 머신 러닝에서 실수를 표현하는 데 일반적으로 사용되는 32비트 부동소수점 숫자를 저장합니다.
- FLOAT16_VECTOR: 메모리 및 대역폭 효율성을 위해 딥러닝 및 GPU 계산에 사용되는 16비트 반정밀도 부동소수점 숫자를 저장합니다.
- BFLOAT16_VECTOR: 정확도는 떨어지지만 지수 범위는 Float32와 동일한 16비트 부동 소수점 숫자를 저장하며, 정확도에 큰 영향을 주지 않고 메모리 및 계산 요구 사항을 줄이기 위해 딥러닝에서 널리 사용됩니다.
- SPARSE_FLOAT_VECTOR: 희소 벡터를 표현하는 데 사용되는 0이 아닌 요소 목록과 그에 해당하는 인덱스를 저장합니다. 자세한 내용은 스파스 벡터를 참조하세요.
Milvus는 컬렉션에서 여러 개의 벡터 필드를 지원합니다. 자세한 내용은 하이브리드 검색을 참조하세요.
컬렉션 스키마
컬렉션 스키마는 컬렉션의 논리적 정의입니다. 일반적으로 컬렉션 스키마를 정의하고 컬렉션을 관리하기 전에 필드 스키마를 정의해야 합니다.
컬렉션 스키마 속성
속성 | 설명 | 참고 |
---|---|---|
field |
만들 컬렉션의 필드 | 필수 |
description |
컬렉션에 대한 설명 | 데이터 유형입니다: 문자열 선택 사항 |
partition_key_field |
파티션 키 역할을 하도록 설계된 필드의 이름입니다. | 데이터 유형: 문자열 선택 사항 |
enable_dynamic_field |
동적 스키마 활성화 여부 | 데이터 유형: 부울(true 또는 false ).선택 사항, 기본값은 False 입니다.동적 스키마에 대한 자세한 내용은 동적 스키마 및 컬렉션 관리를 위한 사용자 가이드를 참조하세요. |
컬렉션 스키마 만들기
from pymilvus import DataType, FieldSchema, CollectionSchema
id_field = FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, description="primary id")
age_field = FieldSchema(name="age", dtype=DataType.INT64, description="age")
embedding_field = FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=128, description="vector")
# Enable partition key on a field if you need to implement multi-tenancy based on the partition-key field
position_field = FieldSchema(name="position", dtype=DataType.VARCHAR, max_length=256, is_partition_key=True)
# Set enable_dynamic_field to True if you need to use dynamic fields.
schema = CollectionSchema(fields=[id_field, age_field, embedding_field], auto_id=False, enable_dynamic_field=True, description="desc of a collection")
스키마를 지정한 컬렉션을 만듭니다:
from pymilvus import Collection, connections
conn = connections.connect(host="127.0.0.1", port=19530)
collection_name1 = "tutorial_1"
collection1 = Collection(name=collection_name1, schema=schema, using='default', shards_num=2)
- 샤드 번호는
shards_num
로 정의할 수 있습니다. using
에 별칭을 지정하여 컬렉션을 생성할 Milvus 서버를 정의할 수 있습니다.- 파티션 키 기반 멀티 테넌시를 구현해야 하는 경우 필드에서
is_partition_key
을True
으로 설정하여 필드에서 파티션 키 기능을 활성화할 수 있습니다. - 동적 필드를 활성화해야 하는 경우 컬렉션 스키마에서
enable_dynamic_field
을True
으로 설정하여 동적 스키마를 활성화할 수 있습니다.
또한 Collection.construct_from_dataframe
을 사용하여 컬렉션을 만들 수 있으며, 이 경우 DataFrame에서 컬렉션 스키마가 자동으로 생성되어 컬렉션이 생성됩니다.
from pymilvus import Collection
import pandas as pd
df = pd.DataFrame({
"id": [i for i in range(nb)],
"age": [random.randint(20, 40) for i in range(nb)],
"embedding": [[random.random() for _ in range(dim)] for _ in range(nb)],
"position": "test_pos"
})
collection, ins_res = Collection.construct_from_dataframe(
'my_collection',
df,
primary_field='id',
auto_id=False
)