파티션 키 사용
파티션 키는 파티션에 기반한 검색 최적화 솔루션입니다. 특정 스칼라 필드를 파티션 키로 지정하고 검색 시 파티션 키를 기준으로 필터링 조건을 지정하면 검색 범위를 여러 파티션으로 좁혀 검색 효율을 높일 수 있습니다. 이 문서에서는 파티션 키의 사용 방법과 관련 고려 사항을 소개합니다.
개요
Milvus에서는 파티션을 사용하여 검색 범위를 특정 파티션으로 제한함으로써 데이터 분리를 구현하고 검색 성능을 향상시킬 수 있습니다. 파티션을 수동으로 관리하기로 선택한 경우 컬렉션에 최대 1,024개의 파티션을 생성하고 특정 규칙에 따라 이러한 파티션에 엔티티를 삽입하여 특정 수의 파티션 내에서 검색을 제한하여 검색 범위를 좁힐 수 있습니다.
Milvus는 데이터 분리에서 파티션을 재사용하여 컬렉션에 생성할 수 있는 파티션 수의 제한을 극복할 수 있도록 파티션 키를 도입했습니다. 컬렉션을 만들 때 스칼라 필드를 파티션 키로 사용할 수 있습니다. 컬렉션이 준비되면 Milvus는 컬렉션 내에 지정된 수의 파티션을 생성하며, 각 파티션은 파티션 키의 값 범위에 해당합니다. 삽입된 엔티티를 받으면 Milvus는 파티션 키 값에 따라 엔티티를 다른 파티션에 저장합니다.
파티션 대 파티션 키
다음 그림은 Milvus가 파티션 키 기능을 사용하거나 사용하지 않고 컬렉션에서 검색 요청을 처리하는 방법을 보여줍니다.
파티션 키가 비활성화되어 있는 경우 Milvus는 컬렉션 내에서 쿼리 벡터와 가장 유사한 엔티티를 검색합니다. 가장 관련성이 높은 결과가 포함된 파티션을 알고 있는 경우 검색 범위를 좁힐 수 있습니다.
파티션 키가 활성화된 경우 Milvus는 검색 필터에 지정된 파티션 키 값에 따라 검색 범위를 결정하고 일치하는 파티션 내의 엔티티만 검색합니다.
파티션 키 사용 또는 미사용
파티션 키 사용
파티션 키를 사용하려면 다음을 수행해야 합니다.
파티션 키를 설정합니다.
생성할 파티션 수 설정(선택 사항), 그리고
파티션 키를 기준으로 필터링 조건을 만듭니다.
파티션 키 설정
스칼라 필드를 파티션 키로 지정하려면 스칼라 필드를 추가할 때 is_partition_key
속성을 true
으로 설정해야 합니다.
from pymilvus import (
MilvusClient, DataType
)
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus"
)
schema = client.create_schema()
# Add the partition key
schema.add_field(
field_name="my_varchar",
datatype=DataType.VARCHAR,
max_length=512,
# highlight-next-line
is_partition_key=True,
)
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.common.DataType;
import io.milvus.v2.service.collection.request.AddFieldReq;
import io.milvus.v2.service.collection.request.CreateCollectionReq;
MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()
.uri("http://localhost:19530")
.token("root:Milvus")
.build());
// Create schema
CreateCollectionReq.CollectionSchema schema = client.createSchema();
// Add the partition key
schema.addField(AddFieldReq.builder()
.fieldName("my_varchar")
.dataType(DataType.VarChar)
.maxLength(512)
// highlight-next-line
.isPartitionKey(true)
.build());
import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";
const address = "http://localhost:19530";
const token = "root:Milvus";
const client = new MilvusClient({address, token});
// 3. Create a collection in customized setup mode
// 3.1 Define fields
const fields = [
{
name: "my_varchar",
data_type: DataType.VarChar,
max_length: 512,
// highlight-next-line
is_partition_key: true
}
]
export schema='{
"autoId": true,
"enabledDynamicField": false,
"fields": [
{
"fieldName": "my_id",
"dataType": "Int64",
"isPrimary": true
},
{
"fieldName": "my_vector",
"dataType": "FloatVector",
"elementTypeParams": {
"dim": "5"
}
},
{
"fieldName": "my_varchar",
"dataType": "VarChar",
"isPartitionKey": true,
"elementTypeParams": {
"max_length": 512
}
}
]
}'
파티션 번호 설정
컬렉션의 스칼라 필드를 파티션 키로 지정하면 Milvus는 컬렉션에 자동으로 16개의 파티션을 생성합니다. 엔티티를 받으면 Milvus는 이 엔티티의 파티션 키 값에 따라 파티션을 선택하고 해당 파티션에 엔티티를 저장하므로 일부 또는 모든 파티션에 다른 파티션 키 값을 가진 엔티티가 저장됩니다.
컬렉션과 함께 생성할 파티션의 수를 결정할 수도 있습니다. 이는 파티션 키로 지정된 스칼라 필드가 있는 경우에만 유효합니다.
client.create_collection(
collection_name="my_collection",
schema=schema,
# highlight-next-line
num_partitions=1024
)
import io.milvus.v2.service.collection.request.CreateCollectionReq;
CreateCollectionReq createCollectionReq = CreateCollectionReq.builder()
.collectionName("my_collection")
.collectionSchema(schema)
.numPartitions(1024)
.build();
client.createCollection(createCollectionReq);
await client.create_collection({
collection_name: "my_collection",
schema: schema,
num_partitions: 1024
})
export params='{
"partitionsNum": 1024
}'
export CLUSTER_ENDPOINT="http://localhost:19530"
export TOKEN="root:Milvus"
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/collections/create" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
-d "{
\"collectionName\": \"myCollection\",
\"schema\": $schema,
\"params\": $params
}"
필터링 조건 생성
파티션 키 기능이 활성화된 컬렉션에서 ANN 검색을 수행할 때는 검색 요청에 파티션 키와 관련된 필터링 표현식을 포함시켜야 합니다. 필터링 표현식에서는 특정 범위 내에서 파티션 키 값을 제한하여 Milvus가 해당 파티션 내에서 검색 범위를 제한하도록 할 수 있습니다.
다음은 특정 파티션 키 값과 파티션 키 값 집합을 기반으로 한 파티션 키 기반 필터링 예시입니다.
# Filter based on a single partition key value, or
filter='partition_key == "x" && <other conditions>'
# Filter based on multiple partition key values
filter='partition_key in ["x", "y", "z"] && <other conditions>'
// Filter based on a single partition key value, or
String filter = "partition_key == 'x' && <other conditions>";
// Filter based on multiple partition key values
String filter = "partition_key in ['x', 'y', 'z'] && <other conditions>";
// Filter based on a single partition key value, or
const filter = 'partition_key == "x" && <other conditions>'
// Filter based on multiple partition key values
const filter = 'partition_key in ["x", "y", "z"] && <other conditions>'
# Filter based on a single partition key value, or
export filter='partition_key == "x" && <other conditions>'
# Filter based on multiple partition key values
export filter='partition_key in ["x", "y", "z"] && <other conditions>'