You need to enable JavaScript to run this app.
文档中心
向量数据库 Milvus 版

向量数据库 Milvus 版

复制全文
下载 pdf
最佳实践
向量数据库 Milvus 版 Python 客户端和 DiskANN 的大规模向量检索系统实践
复制全文
下载 pdf
向量数据库 Milvus 版 Python 客户端和 DiskANN 的大规模向量检索系统实践
随着生成式 AI、推荐系统和语义搜索等应用的快速发展,向量数据规模正在持续增长。传统基于关键字或结构化索引的检索方式难以满足高维向量数据的相似度搜索需求。向量数据库 Milvus 版作为一款高性能向量数据库,提供了面向海量向量数据的存储与近似最近邻(ANN)搜索能力,而 DiskANN 则通过基于磁盘的索引结构,在保持高查询效率的同时显著降低内存消耗,实现在十亿级规模数据上执行向量检索。​
本文将介绍如何结合向量数据库 Milvus 版 Python 客户端与 DiskANN 索引构建一个面向大规模向量数据的检索系统。​
前提条件​
  • 已创建向量数据库 Milvus 版实例,获取实例的私网地址并开启私网地址公网解析。具体操作,请参见创建实例和查看实例信息。​
  • 已安装或升级 PyMilvus SDK。当前向量数据库 Milvus 版实例基于 2.5 版本内核,建议 SDK 同样使用 2.5 版本以确保兼容性。示例命令如下。​
  • ​
    # 安装指定版本的 PyMilvus SDK,例如 2.5.18​
    pip install pymilvus==2.5.18​
    ​
    # 将 PyMilvus SDK 升级至最新版本​
    pip install --upgrade pymilvus​
    ​
    # 验证安装是否成功​
    python -m pip list | grep pymilvus​
    ​
  • 已初始化 Python 客户端。示例代码如下。​
  • ​
    from pymilvus import MilvusClient, DataType​
    ​
    #1. 使用 admin 用户访问客户端。​
    client = MilvusClient(​
    uri="http://xxxxxx.milvus.ivolces.com:19530", # 获取的实例私网地址。​
    token="admin:<password>", # <password> 为 admin 用户的密码。​
    )​
    ​
    # 2. 使用非 admin 用户访问客户端。​
    client = MilvusClient(​
    uri="http://xxxxxx.milvus.ivolces.com:19530", # 获取的实例私网地址。​
    token="<user>:<password>", # 用户名和密码。​
    )​
    ​
数据库管理​
数据库管理常用代码如下所示。​
​
# 创建数据库​
client.create_database(​
db_name="my_database_2"​
)​
​
# 查询数据库​
databases = client.list_databases()​
​
# 删除数据库​
client.drop_database(​
db_name="my_database_2"​
)​
​
更多数据库属性请参见管理数据库属性。​
Collection 管理​
Collection 管理常用代码如下所示。​
​
# 创建 Schema​
schema = MilvusClient.create_schema(​
auto_id=False,​
enable_dynamic_field=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 包含一个主键和至少一个向量字段。支持的 Schema 类型请参见模式解释。​
如果需要执行 Upsert 操作,主键必须设置为 auto_id=False。如果设置 auto_id=True,则无法使用 Upsert 功能。​
建议在创建 Collection 时同时创建索引。向量字段必须定义索引;对于经常用于过滤的标量字段,也强烈建议创建索引。示例代码如下。​
​
index_params = client.prepare_index_params()​
​
index_params.add_index(​
field_name="id",​
index_type="AUTOINDEX"​
)​
​
index_params.add_index(​
field_name="vector", ​
index_type="AUTOINDEX",​
metric_type="COSINE"​
)​
​
使用 Schema 创建 Collection,并使用 list_collections 获取并查看当前的 Collection 列表。​
​
# 创建 Collection​
client.create_collection(​
collection_name="customized_setup_1",​
schema=schema,​
index_params=index_params​
)​
​
# 查看加载状态​
res = client.get_load_state(​
collection_name="customized_setup_1"​
)​
​
# 查看 Collection 列表​
collections = client.list_collections()​
​
# 查看 Collection 详情​
res = client.describe_collection(​
collection_name="customized_setup_1"​
)​
​
# 删除 Collection​
client.drop_collection(​
collection_name="customized_setup_1"​
)​
​
实体管理​
实体类似于关系型数据库中的一行数据,或 Elasticsearch 中的一个文档。实体管理常用代码如下所示。​
​
# 插入​
data = [​
{"id": 0, "vector": [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592], "color": "pink_8682"},​
{"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "color": "red_7025"}]​
​
res = client.insert(​
collection_name="customized_setup_1",​
data=data​
)​
​
# 更新​
data=[​
{"id": 0, "vector": [-0.619954382375778, 0.4479436794798608, -0.17493894838751745, -0.4248030059917294, -0.8648452746018911], "color": "black_9898"},​
{"id": 1, "vector": [0.4762662251462588, -0.6942502138717026, -0.4490002642657902, -0.628696575798281, 0.9660395877041965], "color": "red_7319"}]​
​
res = client.upsert(​
collection_name='customized_setup_1',​
data=data​
)​
​
# 删除​
res = client.delete(​
collection_name="customized_setup_1",​
ids=[0,1]​
)​
​
索引管理​
在定义 Collection 时,可以指定要创建的索引以加速搜索性能,并且每个向量字段都必须配置索引。索引管理常用代码如下所示。​
​
index_params = client.prepare_index_params()​
​
# 添加索引​
index_params.add_index(​
field_name="id",​
index_type="AUTOINDEX"​
)​
​
index_params.add_index(​
field_name="vector",​
index_type="AUTOINDEX",​
metric_type="COSINE"​
)​
​
client.create_collection(​
collection_name="test_entities",​
schema=schema,​
index_params=index_params # 索引参数​
)​
​
不同的字段类型支持不同的索引类型。向量字段可以使用 AUTOINDEX 或其他索引类型。索引类型详情请参见索引解释。​
搜索管理​
如果 Collection 之前已经被释放,搜索前需要先将其加载。详细信息请参见加载和释放。加载代码如下所示。​
​
client.load_collection(collection_name="your_collection_name")​
​
查看加载状态代码如下所示。​
​
​
res = client.get_load_state(collection_name="your_collection_name")​
print(res)​
# print out:{"state": "<LoadState: Loaded>"}​
​
确认 Collection 已成功加载后,可对其执行搜索操作。代码如下所示。示例搜索代码如下。​
​
# 单个向量搜索​
query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]​
res = client.search(​
collection_name="customized_setup_1",​
anns_field="vector",​
data=[query_vector],​
limit=3,​
search_params={"metric_type": "IP"}​
)​
​
# 批量向量搜索​
query_vectors = [​
[0.041732933, 0.013779674, -0.027564144, -0.013061441, 0.009748648],​
[0.0039737443, 0.003020432, -0.0006188639, 0.03913546, -0.00089768134]​
]​
​
res = client.search(​
collection_name="customized_setup_1",​
data=query_vectors,​
limit=3,​
)​
​
DiskANN 索引管理​
创建 DiskANN 索引示例代码如下。​
​
index_params = {​
"index_type": "DISKANN",​
"metric_type": "L2",​
"params": {​
"search_list_size": 128,​
"max_degree": 64,​
}​
}​
​
collection.create_index(​
field_name="vector",​
index_params=index_params​
)​
​
说明​
不建议修改 pq_code_budget_gb_ratio 和 search_cache_budget_gb_ratio 等参数;默认值对大多数工作负载已经进行了良好优化。参数 search_list_size 和 max_degree 通常与召回率正相关,但与 QPS 性能负相关,因此应根据实际性能需求谨慎调整。​
构建参数(RaBitQ 和 PQ)​
​
参数​
类型​
默认值​
取值范围​
说明​
store_strategy​
String​
MEMORY​
  • DISK​
  • MEMORY​
指定 DiskANN 的存储策略。​
  • MEMORY:完全在内存中构建索引(性能最佳)。​
  • DISK:使用磁盘构建,适用于大规模数据或内存受限环境。​
quant_type​
String​
RABITQ​
  • RABITQ​
  • PQ​
定义索引构建时使用的量化方法。​
  • RABITQ:使用 RaBitQ 量化。​
  • PQ:使用 Product Quantization。当 legacy=true 时该参数会被忽略。​
distance_strategy​
String​
QUANT THEN MORE BITS​
  • FULL, SINGLE QUANT​
  • QUANT THEN FULL​
  • QUANT THEN MORE BITS​
指定搜索时的距离计算策略。​
  • FULL:全精度搜索。​
  • SINGLE QUANT:纯量化搜索。​
  • QUANT THEN FULL:量化搜索后再进行全精度精排。​
  • QUANT THEN MORE BITS:1-bit RaBitQ 搜索后再用 4-bit RaBitQ 精排。当 quant_type=PQ 时会自动回退为 SINGLE QUANT。​
num_threads​
Int​
2​
[2, int_max]​
索引构建时使用的线程数。增加该值可提高构建吞吐量,但需要与机器 CPU 资源匹配。​
legacy​
String​
"false"​
  • false​
  • true​
是否使用旧版 DiskANN 实现。​
  • false:表示使用新的 DiskANN 引擎(推荐)。​
  • true:表示使用开源版 Milvus 的旧实现方式。​
max_degree​
Int​
48​
[1, 2048]​
图中每个节点允许的最大邻居数量。值越大,图质量越高,但构建时间和内存消耗也会增加。​
build_dram_budget_gb​
Int​
0​
[0, int_max]​
索引构建时可使用的 DRAM 总预算。0 表示自动。当内存不足时,构建过程会自动切换为子图构建模式。​
search_cache_budget_gb_ratio​
Float​
0.1​
[0.0, 0.3)​
搜索缓存大小相对于原始数据集大小的比例。提高该值可以提升搜索性能,但会增加内存使用。​
rabitq_centers​
Int​
64​
[1, int_max]​
RABITQ 使用的聚类中心数量。通常不建议修改,除非有明确需求。​
pq_code_budget_gb_ratio​
Float​
0.125​
(0.0, 0.25]​
用于存储 PQ 编码的磁盘预算比例:PQ 代码大小 = 原始向量大小 × pq_code_budget_gb_ratio。通常保持默认值即可。​
search_list_size​
Int​
128​
[1, int_max]​
图遍历时的候选节点池大小,是平衡召回率和性能的重要参数。构建阶段:值越大图质量越高;搜索阶段:值越大召回率越高,但 QPS 越低。​
beam_width_ratio​
Int​
4​
[1, max(128 / CPU_count, 16)]​
每次搜索迭代允许的最大 I/O 请求数与 CPU 数量之间的比例。值越大并行度越高,但可能增加 I/O 压力。​
​
​
最近更新时间:2026.04.09 14:06:20
这个页面对您有帮助吗?
有用
有用
无用
无用