【开源向量数据库】Milvus简介
Milvus 是一个开源、高性能、可扩展的向量数据库,专门用于存储和检索高维向量数据。它支持近似最近邻搜索(ANN),适用于图像检索、自然语言处理(NLP)、推荐系统、异常检测等 AI 应用场景。
官网:https://milvus.io/
1. Milvus 的特点
(1)高性能
- 支持数十亿级向量数据,查询速度快。
- 使用 近似最近邻(ANN)索引算法,如 HNSW、IVF-FLAT、IVF-PQ、SCANN 等。
(2)分布式架构
- 可以横向扩展(scalability),适用于大规模数据集。
- 支持云端部署,可结合 Kubernetes 进行管理。
(3)多种索引支持
- HNSW(Hierarchical Navigable Small World):高效、高准确度的图索引。
- IVF-FLAT(Inverted File Index + Flat Search):适用于大规模数据检索。
- IVF-PQ(Inverted File Index + Product Quantization):节省存储,提高检索效率。
(4)多种数据类型
- 支持不同类型的向量(浮点数、二进制),同时可存储元数据(metadata),比如文本、标签等。
- 支持 JSON 存储,可以存放结构化数据。
(5)多种 API 语言支持
- Python
- Go
- Java
- C++
(6)与 AI 生态兼容
- 可与 PyTorch、TensorFlow、OpenAI Embeddings、Hugging Face 集成,用于 NLP、计算机视觉等任务。
- 支持 Kubernetes 部署,适合云原生应用。
2. Milvus 架构
Milvus 采用 分布式架构,主要组件包括:
| 组件 | 作用 |
|---|---|
| Proxy | 处理客户端请求,分发查询 |
| QueryNode | 负责向量搜索 |
| IndexNode | 负责构建索引 |
| DataNode | 负责存储和管理数据 |
| MetaStore | 存储元数据 |
| Coordinator(协调器) | 负责管理集群 |
3. 安装 Milvus
Milvus 可以使用 Docker 进行安装:
(1)Linux下的安装方法
1)安装 Docker & Docker Compose
# 安装 Docker
sudo apt update
sudo apt install -y docker.io# 安装 Docker Compose
sudo apt install -y docker-compose
2)拉取 Milvus
git clone https://github.com/milvus-io/milvus.git
cd milvus
3)启动 Milvus
docker-compose up -d
(2)Windows 下的安装方法
在 Windows 上安装 Milvus 主要有两种方式:
- 使用 Docker 安装(推荐)
- 使用 WSL(Windows Subsystem for Linux)安装
方法 1:使用 Docker 安装 Milvus(推荐)
1.1 安装 Docker
- 下载并安装 Docker Desktop for Windows
- 启用 WSL 2 后端
- 打开 Docker Desktop 设置
- 进入 General 选项卡,勾选 Use the WSL 2 based engine
- 启用 Windows 容器支持(可选,但建议启用)
1.2 下载 Milvus
git clone https://github.com/milvus-io/milvus.git cd milvus
1.3 启动 Milvus
docker-compose up -d
- 该命令会下载 Milvus 并启动默认的服务,端口
19530可用于 API 访问。
方法 2:使用 WSL 安装 Milvus
2.1 启用 WSL
wsl --install
- 确保 WSL 版本为 2:
wsl --set-default-version 2
- 安装 Ubuntu:
wsl --install -d Ubuntu
2.2 安装 Docker
sudo apt update // 更新软件包列表
sudo apt install -y docker.io // 安装 Docker
sudo apt install docker-compose -y // 安装 docker-compose
2.3 下载并启动 Milvus
cd ~ // 尝试在 WSL 内部的 Linux 文件系统(如 ~/)中克隆
git clone https://github.com/milvus-io/milvus.git
cd milvus
docker-compose up -d
4. Milvus 管理工具
3.1 Attu
- Attu 是官方推荐的 Milvus 可视化管理工具:
- 安装 Attu
docker run -d --name attu -p 3000:3000 zilliz/attu
- 访问
http://localhost:3000
5. 默认接口、用户名、密码
| 配置项 | 默认值 |
|---|---|
| 接口 | 19530 |
| 用户名 | 无默认用户名 |
| 密码 | 无默认密码 |
注意:默认情况下,Milvus 没有身份验证。若需安全访问,可以通过代理层或内部网权限控制实现认证。
6. 使用 Python 操作 Milvus
安装 pymilvus
pip install pymilvus
创建 Milvus 连接
from pymilvus import connectionsconnections.connect(host="localhost", port="19530")
创建 Collection
from pymilvus import Collection, CollectionSchema, FieldSchema, DataType# 定义 Collection 结构
fields = [FieldSchema(name="id", dtype=DataType.INT64, is_primary=True),FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=128)
]schema = CollectionSchema(fields, description="Example Collection")# 创建 Collection
collection = Collection(name="example_collection", schema=schema)
插入数据
import numpy as np# 生成 1000 个 128 维的随机向量
num_vectors = 1000
dim = 128
vectors = np.random.rand(num_vectors, dim).tolist()
ids = list(range(num_vectors))# 插入数据
collection.insert([ids, vectors])
创建索引
index_params = {"metric_type": "L2", # 余弦相似度/欧式距离"index_type": "IVF_FLAT","params": {"nlist": 128}
}collection.create_index(field_name="vector", index_params=index_params)
查询相似向量
# 生成查询向量
query_vector = np.random.rand(1, 128).tolist()# 进行相似性搜索
collection.load()
result = collection.search(query_vector, "vector", param={"nprobe": 10}, limit=5)# 打印结果
for hits in result:for hit in hits:print(f"ID: {hit.id}, Distance: {hit.distance}")
7. 使用 Java 操作 Milvus
7.1 安装 Java 依赖
在 pom.xml 添加:
<dependency><groupId>io.milvus</groupId><artifactId>milvus-sdk-java</artifactId><version>2.3.2</version>
</dependency>
7.2 连接 Milvus
import io.milvus.client.*;
import io.milvus.param.ConnectParam;public class MilvusExample {public static void main(String[] args) {MilvusServiceClient client = new MilvusServiceClient(ConnectParam.newBuilder().withHost("localhost").withPort(19530).build());System.out.println("Connected to Milvus");}
}
7.3 创建 Collection
import io.milvus.param.collection.*;
import io.milvus.grpc.DataType;
import java.util.Arrays;public class CreateCollection {public static void main(String[] args) {MilvusServiceClient client = new MilvusServiceClient(ConnectParam.newBuilder().withHost("localhost").withPort(19530).build());FieldType idField = FieldType.newBuilder().withName("id").withDataType(DataType.Int64).withPrimaryKey(true).build();FieldType vectorField = FieldType.newBuilder().withName("vector").withDataType(DataType.FloatVector).withDimension(128).build();CollectionMapping collectionMapping = CollectionMapping.newBuilder().withCollectionName("example_collection").withDescription("Test collection").withFieldTypes(Arrays.asList(idField, vectorField)).build();client.createCollection(collectionMapping);System.out.println("Collection Created");}
}
7.4 插入数据
import io.milvus.param.dml.InsertParam;
import java.util.*;public class InsertData {public static void main(String[] args) {MilvusServiceClient client = new MilvusServiceClient(ConnectParam.newBuilder().withHost("localhost").withPort(19530).build());List<Long> ids = Arrays.asList(1L, 2L, 3L);List<List<Float>> vectors = new ArrayList<>();vectors.add(Arrays.asList(0.1f, 0.2f, 0.3f, ... 128个值));vectors.add(Arrays.asList(0.4f, 0.5f, 0.6f, ... 128个值));InsertParam insertParam = InsertParam.newBuilder().withCollectionName("example_collection").withFields(Arrays.asList(ids, vectors)).build();client.insert(insertParam);System.out.println("Data Inserted");}
}
7.5 查询相似向量
import io.milvus.param.dml.SearchParam;
import io.milvus.param.MetricType;public class SearchVector {public static void main(String[] args) {MilvusServiceClient client = new MilvusServiceClient(ConnectParam.newBuilder().withHost("localhost").withPort(19530).build());List<List<Float>> queryVectors = new ArrayList<>();queryVectors.add(Arrays.asList(0.1f, 0.2f, 0.3f, ... 128个值));SearchParam searchParam = SearchParam.newBuilder().withCollectionName("example_collection").withTopK(5).withMetricType(MetricType.L2).withVectors(queryVectors).build();System.out.println(client.search(searchParam));}
}
8. SaaS 化系统的多租户支持
SaaS 系统中,每个租户(Tenant)应有独立的数据管理方案:
方法 1:独立 Collection
- 每个租户一个 Collection,例如
tenant1_vectors、tenant2_vectors - 适用于小规模租户
方法 2:添加租户字段
- 在同一 Collection 里添加
tenant_id字段:
{ "id": 123, "tenant_id": "tenant_A", "vector": [0.1, 0.2, ...] }
- 查询时加上租户过滤:
SearchParam searchParam = SearchParam.newBuilder() .withCollectionName("example_collection") .withFilter("tenant_id = 'tenant_A'") .build();
方法 3:使用多个 Milvus 实例
- 适用于大型 SaaS 平台
- 每个租户一个独立的 Milvus 集群
- 需要负载均衡和资源隔离
9. Milvus 的应用场景
1) 语义搜索
- 结合 OpenAI Embeddings,可用于语义搜索(文本相似度计算)。
2) 图像搜索
- 存储图片特征向量,实现以图搜图功能。
3) 推荐系统
- 存储用户兴趣向量,计算个性化推荐。
4) 生物信息学
- DNA 比对,通过向量相似性计算基因相似度。
10. Milvus vs 其他向量数据库
| 数据库 | 主要特点 | 适用场景 |
|---|---|---|
| Milvus | 分布式、云原生、多索引支持 | NLP、推荐系统、大规模向量数据 |
| FAISS | 高效 GPU 加速,适用于离线任务 | 超大规模数据离线处理 |
| Pinecone | 云托管,易用性强 | SaaS 应用、无需自己部署 |
| Weaviate | 结合语义搜索,支持 JSON 存储 | 文本搜索、知识库 |
| HNSWlib | 高速图索引,适合小型应用 | 小规模向量检索 |
11. 总结
- Milvus 是一个高性能、可扩展的向量数据库,适用于大规模 AI 应用,尤其适用于NLP、计算机视觉、推荐系统等场景。
- 支持多种索引算法(HNSW、IVF-FLAT、IVF-PQ),可以根据不同的需求进行优化。
- 兼容 PyTorch、TensorFlow、Hugging Face,易于集成到 AI 生态系统中。
- 支持分布式部署,适合云端应用,可以利用 Kubernetes 进行管理。
如果你需要处理数千万甚至上亿的向量数据,Milvus 是一个非常好的选择!
相关文章:
【开源向量数据库】Milvus简介
Milvus 是一个开源、高性能、可扩展的向量数据库,专门用于存储和检索高维向量数据。它支持近似最近邻搜索(ANN),适用于图像检索、自然语言处理(NLP)、推荐系统、异常检测等 AI 应用场景。 官网:…...
机器学习笔记——常用损失函数
大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本笔记介绍机器学习中常见的损失函数和代价函数,各函数的使用场景。 热门专栏 机器学习 机器学习笔记合集 深度学习 深度学习笔记合集 文章目录 热门…...
Nginx--日志(介绍、配置、日志轮转)
前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 一、Nginx日志介绍 nginx 有一个非常灵活的日志记录模式,每个级别的配置可以有各自独立的访问日志, 所需日志模块 ngx_http_log_module 的…...
2025 vue3面试题汇总,通俗易懂
一、基础概念与核心特性 1. Vue3 相比 Vue2 的改进(通俗版) 问题:Vue3 比 Vue2 好在哪? 答案: 更快: Proxy 代理:Vue2 的响应式像“逐个监听保险箱”(每个属性单独监听࿰…...
一周学会Flask3 Python Web开发-Debug模式开启
锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 默认情况,项目开发是普通模式,也就是你修改了代码,必须重启项目,新代码才生效&…...
聚焦于机器人研究,提出 FuSe 方法,通过语言锚定对通用机器人策略进行微调 视觉、触觉、听觉
聚焦于机器人研究,提出 FuSe 方法,通过语言锚定对通用机器人策略进行微调,利用多模态传感器提升性能,在多种任务中表现优异,具备跨模态推理能力。 研究背景:与世界交互需多感官协作,当前先进通用机器人策略多依赖视觉和本体感受数据训练,忽略其他模态信息。方法:FuSe …...
C++ 无锁队列:原理与实现
引言 在多线程编程中,队列是一种常用的数据结构。传统的队列在多线程环境下访问时,通常需要使用锁机制来保证数据的一致性和线程安全。然而,锁的使用会带来性能开销,尤其是在高并发场景下,频繁的加锁和解锁操作可能成…...
web的分离不分离:前后端分离与不分离全面分析
让我们一起走向未来 🎓作者简介:全栈领域优质创作者 🌐个人主页:百锦再新空间代码工作室 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[1504566…...
MobileSal:极其高效的RGB-D显著性物体检测模型
摘要 问题一:什么叫做MobileSal? MobileSal 是指一种用于移动设备上的显著性检测(Saliency Detection)方法,通常是针对在资源受限的环境(如智能手机)上运行的视觉模型。 问题二:什…...
【个人总结】1. 开发基础 工作三年的嵌入式常见知识点梳理及开发技术要点(欢迎指正、补充)
【个人总结】1. 开发基础 工作三年的嵌入式常见知识点梳理及开发技术要点(欢迎指正、补充) 工作快三年以来 分别进行了嵌入式MCU及外设开发、RTOS、传感器、文件系统及USB、Linux、GUI、通讯协议、毫米波雷达、少量的DSP和物联网开发。 特此总结&#x…...
硬核技术组合!用 DeepSeek R1、Ollama、Docker、RAGFlow 打造专属本地知识库
文章目录 一、引言二、安装Ollama部署DeepSeekR1三、安装Docker四、安装使用RAGFlow4.1 系统架构4.2 部署流程4.3 使用RAGFlow4.4 在RAGFlow中新增模型4.5 创建知识库4.6 创建私人助理使用RGA 一、引言 本地部署DeepSeek R1 Ollama RAGFlow构建个人知识库,通过将…...
MySQL官网驱动下载(jar包驱动和ODBC驱动)【详细教程】
1.打开MySQL的官网,选择下载(Download) MySQL[这里是图片001]https://www.mysql.com/cn/ 2.往下划点击MySQL Community(GPL)Downloads 3.要下载MySQL的jar包的选择Connector/J 4.进入后,根据自己的需求选择相应的版本 5.下载完成后,进行解压…...
idea 2019.3常用插件
idea 2019.3常用插件 文档 idea 2019.3常用插件idea 2023.3.7常用插件 idea 2019.3常用插件 插件名称插件版本说明1AceJump3.5.9AceJump允许您快速将插入符号导航到编辑器中可见的任何位置。只需按“ctrl;”,键入一个字符,然后在Ace Jump…...
对CSS了解哪些?
CSS(Cascading Style Sheets,层叠样式表)是用来描述HTML文档外观和布局的语言。以下是对CSS的常见了解范围: 1. CSS 基础 选择器:如通用选择器 (*)、类型选择器、类选择器 (.class)、ID选择器 (#id)、后代选择器、伪类…...
TikTok账户安全指南:如何取消两步验证?
TikTok账户安全指南:如何取消两步验证? 在这个数字化的时代,保护我们的在线账户安全变得尤为重要。TikTok,作为全球流行的社交媒体平台,其账户安全更是不容忽视。两步验证作为一种增强账户安全性的措施,虽…...
从零到一:构建现代 React 应用的完整指南
1. create-react-app (CRA) 简介: create-react-app 是官方推荐的 React 项目脚手架工具,提供了一个开箱即用的开发环境,帮助开发者快速启动 React 应用。它会自动配置 Webpack、Babel、ESLint 等工具,让你专注于开发而不需要手动配置工具链。 特点: 零配置:CRA 自动配…...
【Python爬虫(26)】Python爬虫进阶:数据清洗与预处理的魔法秘籍
【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取ÿ…...
机器学习数学基础:28.卡方检验
卡方检验教程 一、引言 在统计学的广阔领域中,卡方检验(Chi - Square Test)宛如一把锐利的手术刀,能够精准剖析数据背后隐藏的关系与模式。它主要用于两大核心任务:一是深入分析两个及两个以上分类变量之间错综复杂的…...
【工具插件类教学】实现运行时2D物体交互的利器Runtime2DTransformInteractor
目录 编辑 1. 插件核心功能 1.1 基础变换操作 1.2 高级特性 2. 安装与配置 2.1 导入插件 2.2 配置控制器参数 2.3 为物体添加交互功能 3. 使用示例 3.1 基础操作演示 3.2 多选与批量操作 3.3 自定义光标与外观 4. 高级配置技巧 4.1 动态调整包围框控件尺寸 4.…...
回调处理器
文章目录 什么是回调处理器回调处理器的工作流程回调处理器的使用自定义链组件中的回调 内置回调处理器自定义回调处理器 在编程领域中,回调是一个非常重要的概念。简而言之,回调是一种特殊的函数或方法,它可以被传递给另一个函数作为参数&am…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...
WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...
