管理分区
本指南将指导您如何在集合中创建和管理分区。
概述
在 Milvus 中,一个分区代表集合的一个子部分。这种功能允许将集合的物理存储划分为多个部分,通过将焦点缩小到数据的一个较小子集,有助于提高查询性能,而不是整个集合。
在 创建集合时,至少会自动创建一个名为 _default 的默认分区。您可以在一个集合中创建最多 4,096 个分区。
注意
Milvus 引入了一个名为 Partition Key 的功能,利用底层分区根据特定字段的哈希值存储实体。该功能有助于实现多租户,提升搜索性能。详情请阅读 使用分区键。
如果在集合中启用了 Partition Key 功能,Milvus 将负责管理所有分区,减轻您的责任。
准备工作
下面的代码片段重新利用现有代码,建立与 Milvus 的连接并以快速设置模式创建集合,指示在创建时加载集合。
对于准备工作,使用 MiluvsClient
连接到 Milvus,并使用 create_collection()
在快速设置模式下创建集合。
对于准备工作,使用 MilvusClientV2
连接到 Milvus,并使用 createCollection()
在快速设置模式下创建集合。
对于 准备工作,使用 MilvusClient
连接到 Milvus,并使用 createCollection()
在快速设置模式下创建集合。
from pymilvus import MilvusClient, DataType
# 1. 设置 Milvus 客户端
client = MilvusClient(
uri="http://localhost:19530"
)
# 2. 创建集合
client.create_collection(
collection_name="quick_setup",
dimension=5,
)
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.service.collection.request.CreateCollectionReq;
String CLUSTER_ENDPOINT = "http://localhost:19530";
// 1. 连接到 Milvus 服务器
ConnectConfig connectConfig = ConnectConfig.builder()
.uri(CLUSTER_ENDPOINT)
.build();
MilvusClientV2 client = new MilvusClientV2(connectConfig);
// 2. 在快速设置模式下创建一个集合
CreateCollectionReq quickSetupReq = CreateCollectionReq.builder()
.collectionName("quick_setup")
.dimension(5)
.build();
client.createCollection(quickSetupReq);
const address = "http://localhost:19530"
// 1. 设置 Milvus 客户端
client = new MilvusClient({address});
// 2. 在快速设置模式下创建集合
await client.createCollection({
collection_name: "quick_setup",
dimension: 5,
});
注意
在上述代码片段中,已经在创建集合的同时创建了集合的索引,表明集合在创建时已经被加载。
列出分区
一旦集合准备就绪,您可以列出其分区。
要列出分区,请使用 list_partitions()
。
要列出分区,请使用 listPartitions()
。
要列出分区,请使用 listPartitions()
。
# 3. 列出分区
res = client.list_partitions(collection_name="quick_setup")
print(res)
# 输出
#
# ["_default"]
import io.milvus.v2.service.partition.request.ListPartitionsReq;
// 3. 列出集合中的所有分区
ListPartitionsReq listPartitionsReq = ListPartitionsReq.builder()
.collectionName("quick_setup")
.build();
List<String> partitionNames = client.listPartitions(listPartitionsReq);
System.out.println(partitionNames);
// 输出:
// ["_default"]
// 3. 列出分区
res = await client.listPartitions({
collection_name: "quick_setup"
})
console.log(res.partition_names)
// 输出
//
// [ '_default' ]
//
上述代码片段的输出包括了指定集合中分区的名称。
创建分区
您可以向集合添加更多分区。一个集合最多可以有 64 个分区。
要创建分区,请使用 create_partition()
。
要创建分区,请使用 createPartition()
。
要创建分区,请使用createPartition()
。
# 4. 创建更多分区
client.create_partition(
collection_name="quick_setup",
partition_name="partitionA"
)
client.create_partition(
collection_name="quick_setup",
partition_name="partitionB"
)
res = client.list_partitions(collection_name="quick_setup")
print(res)
# 输出
#
# ["_default", "partitionA", "partitionB"]
import io.milvus.v2.service.partition.request.CreatePartitionReq;
// 4. 创建更多分区
CreatePartitionReq createPartitionReq = CreatePartitionReq.builder()
.collectionName("quick_setup")
.partitionName("partitionA")
.build();
client.createPartition(createPartitionReq);
createPartitionReq = CreatePartitionReq.builder()
.collectionName("quick_setup")
.partitionName("partitionB")
.build();
client.createPartition(createPartitionReq);
listPartitionsReq = ListPartitionsReq.builder()
.collectionName("quick_setup")
.build();
partitionNames = client.listPartitions(listPartitionsReq);
System.out.println(partitionNames);
// 输出:
// [
// "_default",
// "partitionA",
// "partitionB"
// ]
// 4. 创建更多分区
await client.createPartition({
collection_name: "quick_setup",
partition_name: "partitionA"
})
await client.createPartition({
collection_name: "quick_setup",
partition_name: "partitionB"
})
res = await client.listPartitions({
collection_name: "quick_setup"
})
console.log(res.partition_names)
// 输出
//
// [ '_default', 'partitionA', 'partitionB' ]
//
上面的代码片段在集合中创建一个分区,并列出该集合的分区。
检查特定分区
您还可以检查特定分区的存在。
要检查特定分区,请使用has_partition()
。
要检查特定分区,请使用hasPartition()
。
要检查特定分区,请使用hasPartition()
。
# 5. 检查分区是否存在
res = client.has_partition(
collection_name="quick_setup",
partition_name="partitionA"
)
print(res)
# 输出
#
# True
res = client.has_partition(
collection_name="quick_setup",
partition_name="partitionC"
)
print(res)
# 输出
#
# False
import io.milvus.v2.service.partition.request.HasPartitionReq;
// 5. 检查分区是否存在
HasPartitionReq hasPartitionReq = HasPartitionReq.builder()
.collectionName("quick_setup")
.partitionName("partitionA")
.build();
boolean exists = client.hasPartition(hasPartitionReq);
System.out.println(exists);
// 输出:
// true
hasPartitionReq = HasPartitionReq.builder()
.collectionName("quick_setup")
.partitionName("partitionC")
.build();
exists = client.hasPartition(hasPartitionReq);
System.out.println(exists);
// 输出:
// false
// 5. 检查分区是否存在
res = await client.hasPartition({
collection_name: "quick_setup",
partition_name: "partitionA"
})
console.log(res.value)
// 输出
//
// true
//
res = await client.hasPartition({
collection_name: "quick_setup",
partition_name: "partitionC"
})
console.log(res.value)
// 输出
//
// false
//
上面的代码片段检查了集合是否有名为 partitionA
和 partitionC
的分区。
加载和释放分区
您可以加载和释放特定的分区,使其对搜索和查询可用或不可用。
获取加载状态
要检查集合及其分区的加载状态,请使用 get_load_state()
。
要检查集合及其分区的加载状态,请使用 getLoadState()
。
要检查集合及其分区的加载状态,请使用 getLoadState()
。
# 释放集合
client.release_collection(collection_name="quick_setup")
# 检查加载状态
res = client.get_load_state(collection_name="quick_setup")
print(res)
# 输出
#
# {
# "state": "<LoadState: Loaded>"
# }
res = client.get_load_state(
collection_name="quick_setup",
partition_name="partitionA"
)
print(res)
# 输出
#
# {
# "state": "<LoadState: Loaded>"
# }
res = client.get_load_state(
collection_name="quick_setup",
partition_name="partitionB"
)
print(res)
# 输出
#
# {
# "state": "<LoadState: NotLoad>"
# }
import io.milvus.v2.service.collection.request.GetLoadStateReq;
import io.milvus.v2.service.collection.request.ReleaseCollectionReq;
import io.milvus.v2.service.partition.request.LoadPartitionsReq;
import io.milvus.v2.service.partition.request.ReleasePartitionsReq;
// 6. 单独加载一个分区
// 6.1 释放集合
ReleaseCollectionReq releaseCollectionReq = ReleaseCollectionReq.builder()
.collectionName("quick_setup")
.build();
client.releaseCollection(releaseCollectionReq);
// 6.2 加载 partitionA
LoadPartitionsReq loadPartitionsReq = LoadPartitionsReq.builder()
.collectionName("quick_setup")
.partitionNames(List.of("partitionA"))
.build();
client.loadPartitions(loadPartitionsReq);
Thread.sleep(3000);
// 6.3 检查集合及其分区的加载状态
GetLoadStateReq getLoadStateReq = GetLoadStateReq.builder()
.collectionName("quick_setup")
.build();
boolean state = client.getLoadState(getLoadStateReq);
System.out.println(state);
// 输出:
// true
getLoadStateReq = GetLoadStateReq.builder()
.collectionName("quick_setup")
.partitionName("partitionA")
.build();
state = client.getLoadState(getLoadStateReq);
System.out.println(state);
// 输出:
// true
getLoadStateReq = GetLoadStateReq.builder()
.collectionName("quick_setup")
.partitionName("partitionB")
.build();
state = client.getLoadState(getLoadStateReq);
System.out.println(state);
// 输出:
// false
// 6. 单独加载分区
await client.releaseCollection({
collection_name: "quick_setup"
})
res = await client.getLoadState({
collection_name: "quick_setup"
})
console.log(res.state)
// 输出
//
// LoadStateNotLoad
//
await client.loadPartitions({
collection_name: "quick_setup",
partition_names: ["partitionA"]
})
await sleep(3000)
res = await client.getLoadState({
collection_name: "quick_setup"
})
console.log(res.state)
// 输出
//
// LoadStateLoaded
//
res = await client.getLoadState({
collection_name: "quick_setup",
partition_name: "partitionA"
})
console.log(res.state)
// 输出
//
// LoadStateLoaded
//
res = await client.getLoadState({
collection_name: "quick_setup",
partition_name: "partitionB"
})
console.log(res.state)
// 输出
//
// LoadStateLoaded
//
可能的加载状态可能是以下之 一
-
Loaded
如果至少有一个分区已加载,则将集合标记为
Loaded
。 -
NotLoad
如果没有一个分区被加载,则将集合标记为
NotLoad
。 -
Loading
如果至少有一个分区正在加载过程中,则将集合标记为Loading。
加载分区
要加载集合的所有分区,只需调用load_collection()
。要加载集合的特定分区,请使用load_partitions()
。
要加载集合的所有分区,只需调用loadCollection()
。要加载集合的特定分区,请使用loadPartitions()
。
要加载集合的所有分区,只需调用loadCollection()
。要加载集合的特定分区,请使用loadPartitions()
。
client.load_partitions(
collection_name="quick_setup",
partition_names=["partitionA"]
)
res = client.get_load_state(collection_name="quick_setup")
print(res)
# 输出
#
# {
# "state": "<LoadState: Loaded>"
# }