当前位置: 代码网 > it编程>前端脚本>Python > 基于Python的Milvus完整使用实战案例

基于Python的Milvus完整使用实战案例

2026年03月25日 Python 我要评论
这份教程是milvus 2.4.x + python的开箱即用实战案例,覆盖连接服务、创建集合、建索引、插入数据、向量检索、混合检索、数据管理全流程,适合新手快速上手。一、环境准备1. 启动milvu

这份教程是milvus 2.4.x + python的开箱即用实战案例,覆盖连接服务、创建集合、建索引、插入数据、向量检索、混合检索、数据管理全流程,适合新手快速上手。

一、环境准备

1. 启动milvus服务

推荐用docker一键启动(最简单,无需复杂配置):

# 下载milvus 2.4.x 配置文件
wget https://github.com/milvus-io/milvus/releases/download/v2.4.4/milvus-standalone-docker-compose.yml -o docker-compose.yml
# 启动服务
docker-compose up -d

启动后,milvus默认地址:localhost:19530

2. 安装python客户端

pip install pymilvus>=2.4.0  # 安装官方python sdk
pip install numpy           # 用于生成模拟向量

二、完整实战代码

核心场景:向量数据库的基础crud + 相似度检索(模拟文本/图像特征向量存储与搜索)

# 1. 导入依赖包
from pymilvus import (
    connections,  # 连接milvus
    collection,   # 集合操作
    fieldschema,  # 字段定义
    collectionschema,  # 集合结构
    datatype,     # 数据类型
    utility       # 工具函数(检查集合、删除集合等)
)
import numpy as np
# ====================== 2. 连接milvus服务 ======================
# 默认连接本地milvus,参数:host(地址)、port(端口)、alias(连接别名)
connections.connect(
    alias="default", 
    host="localhost", 
    port="19530"
)
print("✅ 成功连接milvus服务")
# ====================== 3. 定义集合结构(schema) ======================
# 集合 = 表,字段 = 列,必须包含:主键字段 + 向量字段
# 字段1:主键id(自增整数,唯一标识)
primary_field = fieldschema(
    name="id", 
    dtype=datatype.int64, 
    is_primary=true,  # 主键
    auto_id=true      # 自动生成id,无需手动插入
)
# 字段2:向量字段(核心!存储特征向量,512维)
vector_field = fieldschema(
    name="embedding", 
    dtype=datatype.float_vector, 
    dim=512  # 向量维度:必须和你的数据一致
)
# 字段3:标量字段(辅助过滤,比如分类标签)
tag_field = fieldschema(
    name="tag", 
    dtype=datatype.int64
)
# 定义集合整体结构
schema = collectionschema(
    fields=[primary_field, vector_field, tag_field],
    description="milvus基础案例:特征向量存储与检索"
)
# ====================== 4. 创建集合 ======================
collection_name = "milvus_demo"
# 如果集合已存在,先删除(避免重复创建报错)
if utility.has_collection(collection_name):
    utility.drop_collection(collection_name)
# 创建集合
collection = collection(
    name=collection_name,
    schema=schema,
    using="default"  # 使用默认连接
)
print(f"✅ 成功创建集合:{collection_name}")
# ====================== 5. 创建向量索引(必须!) ======================
# milvus必须建索引才能检索,索引决定检索速度和精度
# 入门推荐:ivf_flat(平衡速度和精度)
index_params = {
    "index_type": "ivf_flat",      # 索引类型
    "metric_type": "l2",           # 相似度计算方式:l2(欧氏距离)、ip(内积)、cosine(余弦)
    "params": {"nlist": 128}       # 索引参数(聚类数量)
}
# 为向量字段创建索引
collection.create_index(
    field_name="embedding",
    index_params=index_params
)
print("✅ 成功创建向量索引")
# ====================== 6. 加载集合到内存(必须!) ======================
# 集合创建后默认在磁盘,必须加载到内存才能读写
collection.load()
print("✅ 集合已加载到内存")
# ====================== 7. 插入模拟数据 ======================
# 生成1000条512维随机向量(模拟文本/图像特征)
num_entities = 1000
vectors = np.random.rand(num_entities, 512).tolist()  # 转列表格式
# 生成标量标签(0-9随机分类)
tags = np.random.randint(0, 10, num_entities).tolist()
# 插入数据:字段顺序和schema定义一致
insert_result = collection.insert(
    data=[vectors, tags]  # 自动填充主键(auto_id=true)
)
print(f"✅ 成功插入 {num_entities} 条数据,主键id:{insert_result.ids[:5]}...")
# 刷新数据(确保插入后立即可检索)
collection.flush()
# ====================== 8. 核心功能:向量相似度检索 ======================
# 生成1条查询向量(和插入数据同维度)
search_vector = np.random.rand(1, 512).tolist()
# 检索参数
search_params = {
    "metric_type": "l2",
    "params": {"nprobe": 10}  # 检索精度:值越大越准,速度越慢
}
# 执行检索
results = collection.search(
    data=search_vector,        # 查询向量
    anns_field="embedding",    # 要检索的向量字段
    param=search_params,       # 检索参数
    limit=5,                   # 返回top5最相似的结果
    output_fields=["id", "tag"]# 同时返回的标量字段
)
# 打印检索结果
print("\n🔍 向量相似度检索结果(top5):")
for hits in results:
    for hit in hits:
        print(f"id: {hit.id}, 相似度距离: {hit.distance:.4f}, 标签: {hit.entity.get('tag')}")
# ====================== 9. 进阶:标量过滤 + 向量检索 ======================
# 场景:只检索【标签=3】的向量中,最相似的top3
filtered_results = collection.search(
    data=search_vector,
    anns_field="embedding",
    param=search_params,
    limit=3,
    expr="tag == 3",  # 标量过滤条件(sql风格)
    output_fields=["id", "tag"]
)
print("\n🔍 过滤后检索结果(tag=3,top3):")
for hits in filtered_results:
    for hit in hits:
        print(f"id: {hit.id}, 相似度距离: {hit.distance:.4f}, 标签: {hit.entity.get('tag')}")
# ====================== 10. 数据管理 ======================
# 1. 删除数据(根据主键id)
if len(insert_result.ids) > 0:
    del_id = insert_result.ids[0]
    collection.delete(expr=f"id == {del_id}")
    print(f"\n✅ 成功删除id={del_id}的数据")
# 2. 释放集合(从内存卸载)
collection.release()
print("✅ 集合已从内存释放")
# 3. 删除集合(清空所有数据)
# utility.drop_collection(collection_name)
# print("✅ 已删除集合")
# ====================== 11. 断开连接 ======================
connections.disconnect("default")
print("\n✅ 已断开milvus连接")

三、关键知识点解释

1. 核心概念

概念解释
集合(collection)相当于关系型数据库的,用于存储向量数据
向量字段存储特征向量(文本/图像/音频的数字化特征)
索引加速向量检索的核心,无索引无法检索
相似度计算l2(欧氏距离,越小越相似)、ip(内积,越大越相似)、cosine(余弦相似度)

2. 必做操作

  1. 连接milvus后才能操作
  2. 向量字段必须建索引
  3. 集合必须加载到内存才能读写
  4. 检索前建议flush()刷新数据

3. 检索参数说明

  • nprobe:检索精度,10-100 之间调整,越大越准、速度越慢
  • limit:返回最相似的topn结果
  • expr:标量过滤,支持==、>、<、and、or等条件

四、常见问题

  1. 连接失败:检查milvus服务是否启动(docker ps 查看容器)
  2. 维度不匹配:插入向量的dim必须和schema定义一致
  3. 检索报错:未建索引/未加载集合到内存
  4. 数据不显示:插入后未执行flush()刷新

总结

  1. 本案例覆盖milvus python客户端全流程操作,可直接复制运行
  2. 核心能力是向量相似度检索,适用于ai大模型、图像搜索、推荐系统等场景
  3. 入门优先用ivf_flat索引+l2相似度,后续可根据业务优化索引类型

到此这篇关于基于python的milvus完整使用案例的文章就介绍到这了,更多相关python milvus使用内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com