Milvus 向量数据库详解与实践指南

news2025/5/11 5:44:18

一、Milvus 核心介绍

1. 什么是 Milvus?

        Milvus 是一款开源、高性能、可扩展的向量数据库,专门为海量向量数据的存储、索引和检索而设计。它支持近似最近邻搜索(ANN),适用于图像检索、自然语言处理(NLP)、推荐系统、语义搜索、智能问答、多模态数据处理等 AI 应用场景。它能够高效处理:

  • 嵌入向量(Embeddings)

  • 特征向量(Feature Vectors)

  • 任何高维数值向量

2. 核心特性

特性说明
多索引支持IVF_FLAT、IVF_PQ、HNSW、Annoy 等
分布式架构支持水平扩展,处理十亿级向量
多语言 SDKPython、Java、Go、RESTful API
云原生设计Kubernetes 友好,支持多云部署
混合查询支持向量+标量数据的联合查询

3. 典型应用场景

  • 图像/视频检索

  • 语义文本搜索

  • 推荐系统

  • 异常检测

  • 分子结构搜索

二、详细使用案例:构建电商图像搜索系统

案例背景

为电商平台搭建一个以图搜图系统,用户上传商品图片可找到相似商品。

实施步骤

1. 环境准备
# 安装依赖
pip install pymilvus torch torchvision pillow
2. 特征提取模型
import torch
import torchvision.models as models
from torchvision import transforms

# 使用ResNet50提取特征
model = models.resnet50(pretrained=True)
model.eval()

# 图像预处理
preprocess = transforms.Compose([
    transforms.Resize(256),
    transforms.CenterCrop(224),
    transforms.ToTensor(),
    transforms.Normalize(
        mean=[0.485, 0.456, 0.406],
        std=[0.229, 0.224, 0.225])
])

def extract_features(img_path):
    img = Image.open(img_path)
    img_t = preprocess(img)
    batch_t = torch.unsqueeze(img_t, 0)
    with torch.no_grad():
        features = model(batch_t)
    return features.numpy().flatten()
3. Milvus 集合(Collection)创建
from pymilvus import (
    connections,
    FieldSchema, CollectionSchema, DataType,
    Collection, utility
)

# 连接Milvus
connections.connect("default", host="localhost", port="19530")

# 定义Schema
fields = [
    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True),
    FieldSchema(name="product_id", dtype=DataType.VARCHAR, max_length=64),
    FieldSchema(name="image_vector", dtype=DataType.FLOAT_VECTOR, dim=2048),  # ResNet50输出维度
    FieldSchema(name="category", dtype=DataType.VARCHAR, max_length=128)
]

schema = CollectionSchema(fields, description="Product image search collection")
collection = Collection("product_images", schema)

# 创建索引
index_params = {
    "index_type": "IVF_FLAT",
    "metric_type": "L2",
    "params": {"nlist": 128}
}
collection.create_index("image_vector", index_params)
4. 数据插入
# 假设已有商品图片数据
product_data = [
    {"product_id": "1001", "image_path": "path/to/image1.jpg", "category": "electronics"},
    # 更多商品数据...
]

data = [
    [],  # id列表
    [],  # product_id列表
    [],  # 特征向量列表
    []   # category列表
]

for idx, product in enumerate(product_data):
    features = extract_features(product["image_path"])
    data[0].append(idx)
    data[1].append(product["product_id"])
    data[2].append(features)
    data[3].append(product["category"])

# 批量插入
collection.insert(data)
5. 相似搜索
# 用户上传图片搜索
search_img_path = "user_upload.jpg"
search_vector = extract_features(search_img_path)

search_params = {
    "metric_type": "L2",
    "params": {"nprobe": 16}
}

results = collection.search(
    data=[search_vector],
    anns_field="image_vector",
    param=search_params,
    limit=5,
    output_fields=["product_id", "category"]
)

for hits in results:
    for hit in hits:
        print(f"产品ID: {hit.entity.get('product_id')}, 距离: {hit.distance}, 类别: {hit.entity.get('category')}")

三、关键注意事项

1. 生产环境部署建议

  • 集群部署:单机版仅适合开发测试,生产环境使用分布式集群

  • 资源规划

    • 向量维度越高,所需资源越多

    • 10亿条128维向量 ≈ 500GB内存 + 1TB SSD

  • 高可用配置

    # docker-compose.yml示例配置
    etcd:
      deploy:
        replicas: 3
    minio:
      deploy:
        replicas: 4

    2. 性能优化技巧

  • 索引选择

    场景推荐索引特点
    高精度IVF_FLAT召回率高,内存占用大
    内存敏感IVF_PQ有损压缩,节省内存
    超大规模DISKANN支持SSD存储
  • 查询参数调优

    # 平衡精度与性能的关键参数
    search_params = {
        "nprobe": 32,  # 增大值提高精度但降低性能
        "ef": 64       # HNSW专用参数
    }

    3. 常见问题处理

  • 内存不足
    # 调整Milvus配置
    docker-compose.yml中增加:
    milvus-standalone:
      environment:
        - QUERY_NODE_GC_INTERVAL=300
        - QUERY_NODE_GC_THRESHOLD=0.0001
  • 数据一致性
    # 插入后立即查询可能看不到数据
    collection.flush()  # 手动刷新
  • 版本升级:

    1. 备份元数据(etcd)和对象存储(MinIO)

    2. 使用官方迁移工具 

4. 安全建议

  • 启用身份验证:
    # 启动时配置
    docker-compose.yml:
    environment:
      - MILVUS_AUTHORIZATION_ENABLED=true
      - MILVUS_ROOT_PASSWORD=YourSecurePassword
  • 网络隔离:
    # 只允许内网访问
    networks:
      milvus_net:
        internal: true

四、扩展应用场景

1. 跨模态搜索

# 同时处理文本和图像
multi_modal_collection = CollectionSchema([
    FieldSchema(name="text_vector", dtype=DataType.FLOAT_VECTOR, dim=768),
    FieldSchema(name="image_vector", dtype=DataType.FLOAT_VECTOR, dim=2048)
])

# 混合查询
expr = "category == 'electronics'"
collection.search(
    data=[query_vector],
    anns_field="image_vector",
    expr=expr,  # 结合标量过滤
    limit=10
)

2.实时推荐系统 

# 用户行为向量更新
def update_user_vector(user_id, new_behavior_vec):
    # 获取现有向量
    current_vec = get_user_vector(user_id)
    # 加权平均更新
    updated_vec = 0.9 * current_vec + 0.1 * new_behavior_vec
    # 更新Milvus
    collection.delete(f"id == {user_id}")
    collection.insert([[user_id], [updated_vec]])

五、监控与维护

1. 关键监控指标

指标健康值检查命令
QPS< 1000/节点show metrics
内存使用< 80%docker stats
查询延迟< 50mstime search...

2. 备份策略

# 定期备份
docker exec milvus-minio mc alias set myminio http://minio:9000 minioadmin minioadmin
docker exec milvus-minio mc cp --recursive myminio/milvus /backup/

         通过以上完整案例和注意事项,您可以构建一个高效的向量检索系统。Milvus 2.x 版本相比1.x有显著架构改进,建议新项目直接使用2.x版本。了解更多可以参阅milvus官方文档。安装教程可以参阅下面文章👇:mac 使用 Docker 安装向量数据库Milvus独立版的保姆级别教程-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2372886.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VSCode-插件:codegeex:ai coding assistant / 清华智普 AI 插件

一、官网 https://codegeex.cn/ 二、vscode 安装插件 点击安装即可&#xff0c;无需复杂操作&#xff0c;国内软件&#xff0c;无需科学上网&#xff0c;非常友好 三、智能注释 输入 // 或者 空格---后边自动出现注释信息&#xff0c;&#xff0c;按下 Tab 键&#xff0c;进…

SlideLoss与FocalLoss在YOLOv8分类损失中的应用及性能分析

文章目录 一、引言二、YOLOv8 损失函数概述三、SlideLoss 详解&#xff08;一&#xff09;SlideLoss 的原理&#xff08;二&#xff09;SlideLoss 的代码实现 四、FocalLoss 分类损失函数详解&#xff08;一&#xff09;FocalLoss 的原理&#xff08;二&#xff09;FocalLoss 的…

OpenCv实战笔记(4)基于opencv实现ORB特征匹配检测

一、原理作用 ORB 原理&#xff08;Oriented FAST and Rotated BRIEF&#xff09;&#xff1a; 特征点检测&#xff1a;使用 FAST 算法检测角点&#xff08;关键点&#xff09;。 方向计算&#xff1a;为每个关键点分配主方向&#xff0c;增强旋转不变性。 特征描述&#xff1a…

深入解析路由策略:从流量控制到策略实施

一、网络流量双平面解析 在路由策略的设计中&#xff0c;必须明确区分两个关键平面&#xff1a; 1. 控制层面&#xff08;Control Plane&#xff09; ​​定义​​&#xff1a;路由协议传递路由信息形成的逻辑平面&#xff08;如OSPF的LSA、RIP的Response报文&#xff09;​…

FHE 之 面向小白的引导(Bootstrapping)

1. 引言 FHE初学者和工程师常会讨论的一个问题是&#xff1b; “什么是引导&#xff08;bootstrapping&#xff09;&#xff1f;” 从理论角度看&#xff0c;这个问题的答案很简单&#xff1a; 引导就是套用 Gentry 提出的思想——在加密状态下同态地执行解密操作&#xff…

51单片机入门教程——AT24C02数据存储

前言 本教程基于B站江协科技课程进行个人学习整理&#xff0c;专为拥有C语言基础的零基础入门51单片机新手设计。既帮助解决因时间差导致的设备迭代调试难题&#xff0c;也助力新手快速掌握51单片机核心知识&#xff0c;实现从C语言理论到单片机实践应用的高效过渡 。 目录 …

M0的基础篇之PWM学习

一、困惑 上一节课就是单纯的之配置了一个基础的定时器进行计数&#xff0c;计到一定的数值也就是到了一定的时间就进入中断&#xff0c;执行中断里面的任务&#xff0c;也就是一个最基础的定时的功能 这一节课的定时器产生了一个pwm波。也就是我们可以改变里面高电平的持续时间…

Python----神经网络(基于AlexNet的猫狗分类项目)

一、基于AlexNet的猫狗分类 1.1、项目背景 猫和狗是我们生活中最常见的宠物&#xff0c;它们的图像数据大量存在于互联网上。对此进行分类不仅可以帮助开发自动化宠物识别应用&#xff0c;也可以应用于更广泛的计算机视觉领域。例如&#xff0c;训练良好的模型可以支持流浪动物…

荣耀A8互动娱乐组件部署实录(第1部分:服务端环境搭建)

作者&#xff1a;一位被“只支持安卓”的前端劝退过三次的技术人 前言 这一套组件我拆包已经不止一遍了&#xff0c;老实讲&#xff0c;不支持 iOS 是遗憾&#xff0c;但对于研究 UI 动态加载、资源分离结构和整体架构来说&#xff0c;A8 的这套服务还算完整&#xff0c;服务器…

基于Python Flask的深度学习电影评论情感分析可视化系统(2.0升级版,附源码)

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

计算机学习路线与编程语言选择(信息差)

——授人以鱼不如授人以渔 计算机学习公式&#xff1a;1/3科班思维 1/3路线选择 1/3工程能力 好工作随便找&#xff08;来自B站小毛毛熊&#xff09; 本文主要是路线选择&#xff01;&#xff01;&#xff01;下面开始吧。 面向岗位学习&#xff01;到招聘网站看看有哪些…

【redis】redis 手动切换主从

场景一&#xff1a; 测试需要&#xff0c;需要手动切换主从 在redis节点&#xff1a; $ redis-cli -h xx.xx.xx.xx -p XX -a XX shutdown 不要直接关闭redis进程&#xff0c;使用 shutdown &#xff0c;能在进程关闭前持久化内存中的数据 待主从切换完毕后&#xff1…

第三节:Vben Admin 最新 v5.0 对接后端登录接口(下)

文章目录 前言一、处理请求头Authorization二、/auth/user/info 接口前端接口后端接口三、/auth/codes 接口1.前端2.后端四、测试接口前言 上一节内容,实现了登录的/auth/login 接口,但是登陆没有完成,还需要完成下面两个接口。才能完成登录。 一、处理请求头Authorizatio…

爬虫学习————开始

&#x1f33f;自动化的思想 任何领域的发展原因————“不断追求生产方式的改革&#xff0c;即使得付出与耗费精力越来愈少&#xff0c;而收获最大化”。由此&#xff0c;创造出方法和设备来提升效率。 如新闻的5W原则直接让思考过程规范化、流程化。或者前端框架/后端轮子的…

Ubuntu18.04搭建samda服务器

一.什么是Samba服务器&#xff1f; Samba服务器是一种基于开源协议实现的网络共享服务软件&#xff0c;主要用于在不同操作系统&#xff08;如Windows、Linux、Unix&#xff09;之间实现文件和打印机共享功能。其核心目标是解决跨平台资源共享的兼容性问题&#xff0c;尤其是在…

2025-05-10-FFmepg库裁切有水印的视频

裁后 代码 import subprocess# 文件路径 input_video_path "bg_video.mp4" output_video_path "output_video_cropped.mp4"# 裁剪视频下方的水印 def crop_video(input_video_path, output_video_path, crop_height):# 获取视频的分辨率def get_video…

opencv+opencv_contrib+cuda和VS2022编译

本文介绍使用OpenCV和OpenCV_Contrib源码及Cuda进行编译的过程&#xff0c;编译过程中会用到OpenCV、OpenCV_Contrib、CUDA Toolkit、cuDNN、Cmake、VS2022等工具&#xff0c;最终编译OpenCV的Cuda版本。 一、OpenCV下载地址 OpenCV官网下载地址:https://opencv.org/releases…

网工实验——OSPF配置

网络拓扑图 配置 1.为每个路由器配置接口&#xff08;略&#xff09;&#xff08;详细见RIP实验&#xff09; 2.配置OSPF AR1 [AR1]ospf [AR1-ospf-1]area 1 [AR1-ospf-1-area-0.0.0.1]network 172.16.1.1 0.0.0.0 #精确配置网络&#xff0c;也可以像下面那条命令那样配置 …

数据库系统概论-基础理论

数据库系统概述&#xff1a; 1、记录&#xff1a;计算机中表示和存储数据的一种格式或方法。 2、数据库&#xff08;DataBase, DB&#xff09;&#xff1a;数据库是长期储存在计算机内、有组织、可共享的大量数据集合。可为各种用户共享。 3、数据库管理系统&#xff08;Dat…

从零开始学习人工智能(Python高级教程)Day6-Python3 正则表达式

一、Python3 正则表达式 正则表达式是一个特殊的字符序列&#xff0c;它能帮助你方便的检查一个字符串是否与某种模式匹配。 在 Python 中&#xff0c;使用 re 模块来处理正则表达式。 re 模块提供了一组函数&#xff0c;允许你在字符串中进行模式匹配、搜索和替换操作。 r…