You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于分区键的Milvus多租户实现及搜索问题求助

Milvus 基于分区键的多租户实现验证与搜索指南

一、现有代码的问题修正与正确性说明

你的代码框架方向是对的,但存在两处需要修正的细节:

  1. 主键字段冲突:设置auto_id=True时,Milvus会自动生成名为id的主键字段,无需手动添加id字段,重复添加会导致创建集合失败。
  2. VARCHAR字段缺失max_length:tenant字段为VARCHAR类型,必须指定max_length参数,否则无法通过schema校验。

修正后的完整代码:

schema = MilvusClient.create_schema(auto_id=True, enable_dynamic_field=True, primary_field="id")

# 移除手动添加的id字段,auto_id=True时Milvus自动生成主键
schema.add_field(field_name="source", datatype=DataType.VARCHAR, max_length=50000)
schema.add_field(field_name="embeddings", datatype=DataType.FLOAT_VECTOR, dim=self.truncate_dim)
# 补充tenant字段的max_length,设置为合理长度(如255)
schema.add_field(field_name="tenant", datatype=DataType.VARCHAR, max_length=255, is_partition_key=True)

index_params = MilvusClient.prepare_index_params()
index_params.add_index(field_name="id", index_type="STL_SORT")
index_params.add_index(
    field_name="embeddings",
    index_type="IVF_FLAT",
    metric_type="L2",
    params={"nlist": 1024},
)

self.milvusClient.create_collection(
    collection_name=self.collection_name,
    schema=schema,
    index_params=index_params,
    partition_key_field="tenant"
)

其他配置说明:

  • 给tenant字段设置is_partition_key=True,并在create_collection中指定partition_key_field="tenant",这两步是启用分区键多租户的核心操作,配置正确。
  • 向量字段和主键字段的索引配置符合规范,分区键字段不需要单独创建索引,Milvus会自动维护分区关联。

二、多租户模式下的搜索与数据操作

1. 单租户隔离搜索

搜索时通过filter参数指定租户ID,Milvus会仅在该租户对应的分区内执行查询,保证数据隔离:

# 构造查询参数
search_params = {
    "metric_type": "L2",
    "params": {"nprobe": 10}  # 匹配IVF_FLAT索引的查询参数,nprobe值可根据精度需求调整
}

# 执行搜索
search_results = self.milvusClient.search(
    collection_name=self.collection_name,
    data=[your_query_embedding],  # 替换为你的查询向量
    limit=10,  # 返回结果数量
    search_params=search_params,
    filter="tenant == 'tenant_001'",  # 指定目标租户
    output_fields=["source"]  # 需要返回的非向量字段
)

2. 批量插入多租户数据

插入数据时必须携带tenant字段,Milvus会自动根据字段值创建对应分区(无需手动创建分区):

# 构造多租户数据
batch_data = [
    {
        "source": "租户1文档内容",
        "embeddings": embedding_1,
        "tenant": "tenant_001"
    },
    {
        "source": "租户2文档内容",
        "embeddings": embedding_2,
        "tenant": "tenant_002"
    }
]

# 执行插入
self.milvusClient.insert(
    collection_name=self.collection_name,
    data=batch_data
)

3. 验证分区隔离

可以通过列出集合分区来确认每个租户对应的分区:

partitions = self.milvusClient.list_partitions(collection_name=self.collection_name)
print(partitions)

输出会包含每个租户ID对应的分区(如tenant_001、tenant_002),以及默认分区_default(若存在未指定租户的数据)。


内容的提问来源于stack exchange,提问作者Rashad Tockey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 22:29:52