Milvus 向量数据库介绍及使用
一、Milvus 介绍及安装
Milvus 于 2019 年创建,其目标只有一个:存储、索引和管理由深度神经网络和其他机器学习 (ML) 模型生成的大量嵌入向量。它具备高可用、高性能、易拓展的特点,用于海量向量数据的实时召回。
作为专门为处理输入向量查询而设计的数据库,它能够对万亿规模的向量进行索引。与现有的关系数据库主要处理遵循预定义模式的结构化数据不同,Milvus 是自下而上设计的,旨在处理从非结构化数据转换而来的嵌入向量。
Milvus 采用共享存储架构,存储计算完全分离,计算节点支持横向扩展。从架构上来看,Milvus 遵循数据流和控制流分离,整体分为了四个层次,分别为接入层(access layer)、协调服务(coordinator service)、执行节点(worker node)和存储层(storage)。各个层次相互独立,独立扩展和容灾。

在 Milvus 中相关术语:
-
Collection: 包含一组
Entity,可以理解为关系型数据库中的表。 -
Entity: 包含一组
Field,可以理解为关系型数据库中的行。 -
Field:可以是代表对象属性的结构化数据,也可以是代表对象特征的向量。可以理解为关系型数据库中的字段。
-
Partition:分区,针对
Collection数据分区存储多个部分,每个分区又可以包含多个段。 -
Segment:分段,一个
Partition可以包含多个Segment。一个Segment可以包含多个Entity。在搜索时,会搜索每个Segment合并后返回结果。 -
Sharding:分片,将数据分散到不同节点上,充分利用集群的并行计算能力进行写入,默认情况下,单个
Collection包含 2 个分片。 -
Index:索引,可以提高数据搜索的速度。但一个向量字段仅支持一种索引类型。
更多介绍可以参考官方文档:
官网地址:https://milvus.io/
Milvus Docker 单机部署
单机版 Milvus 主要包括三个组件:
- Milvus:负责提供系统的核心功能。
- etcd :元数据引擎,用于管理
Milvus内部组件的元数据访问和存储,例如:proxy、index node等。 - MinIO :存储引擎,负责维护
Milvus的数据持久化。
需要提前安装好 Docker、Docker-compose 环境。
官方介绍:https://milvus.io/docs/install_standalone-docker.md
下载 docker-compose.yml 文件:
wget https://github.com/milvus-io/milvus/releases/download/v2.3.1/milvus-standalone-docker-compose.yml -O docker-compose.yml
启动 Milvus
docker compose up -d

查看启动服务:
docker ps

安装可视化工具
vi docker-compose-insight.yml
version: '3.5'services:insight:container_name: milvus-insightimage: milvusdb/milvus-insight:latestenvironment:HOST_URL: http://172.19.222.20:3000MILVUS_URL: 172.19.222.20:19530ports:- "3000:3000"networks:- milvusnetworks:milvus:
启动
docker-compose -f docker-compose-insight.yml up -d
浏览器访问可视化页面:
http://ip:3000

二、Python Api 使用
Milvus 与 Python Api 版本对应如下:
| Milvus 版本 | 推荐的 PyMilvus 版本 |
|---|---|
| 1.0.* | 1.0.1 |
| 1.1.* | 1.1.2 |
| 2.0.x | 2.0.2 |
| 2.1.x | 2.1.3 |
| 2.2.x | 2.2.3 |
| 2.3.0 | 2.3.7 |
| 2.4.0-rc.1 | 2.4.0 |
这里安装 2.3.7 版本依赖,推荐 Python 版本 3.8 以上:
pip install pymilvus==v2.3.7 -i https://pypi.tuna.tsinghua.edu.cn/simple
连接 Milvus :
from pymilvus import MilvusClientclient = MilvusClient("http://172.19.222.20:19530")
如果有用户名密码,可以使用:
from pymilvus import MilvusClientclient = MilvusClient(uri="http://localhost:19530",token="root:Milvus",db_name="default"
)
1. 创建 Collection
from pymilvus import MilvusClientclient = MilvusClient("http://172.19.222.20:19530")client.create_collection(collection_name="test", # 集合的名称dimension=5, # 向量的维度primary_field_name="id", # 主键字段名称id_type="int", # 主键的类型vector_field_name="vector", # 向量字段的名称metric_type="L2", # 指标类型,用于测量向量嵌入之间的相似性的算法。auto_id=True # 主键ID自动递增
)
或者自定义设置字段:
from pymilvus import MilvusClient, DataTypeclient = MilvusClient("http://172.19.222.20:19530")# 声明 schema
schema = MilvusClient.create_schema(auto_id=False,enable_dynamic_field=False,
)
# 添加主键字段
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.add_field(field_name="name", datatype=DataType.VARCHAR, max_length=255)
schema.verify()
# 索引
index_params = client.prepare_index_params()
index_params.add_index(field_name="id",index_type="STL_SORT"
)index_params.add_index(field_name="vector",index_type="IVF_FLAT",metric_type="L2",params={"nlist": 1024}
)# 创建 collection
client.create_collection(collection_name="test1",schema=schema,index_params=index_params
)
其中向量索引方式有如下选择:
| 索引 | 说明 |
|---|---|
| FLAT | 准确率高, 适合数据量小,暴力求解相似。 |
| IVF-FLAT | 量化操作, 准确率和速度的平衡 |
| IVF | inverted file 先对空间的点进行聚类,查询时先比较聚类中心距离,再找到最近的N个点。 |
| IVF-SQ8 | 量化操作,disk cpu GPU 友好 |
| SQ8 | 对向量做标量量化,浮点数表示转为int型表示,4字节->1字节。 |
| IVF-PQ | 快速,但是准确率降低,把向量切分成m段,对每段进行聚类 |
| HNSW | 基于图的索引,高效搜索场景,构建多层的NSW。 |
| ANNOY | 基于树的索引,高召回率 |
执行后可在可视化工具中看到创建的 Collection :

2. insert 写入数据:
from pymilvus import MilvusClientclient = MilvusClient("http://172.19.222.20:19530")# 写入一条
res1 = client.insert(collection_name="test1", # 前面创建的 collection 名称data={"id": 0, # 主键ID"vector": [ # 向量0.6186516144460161,0.5927442462488592,0.848608119657156,0.9287046808231654,-0.42215796530168403],"name": "测试1" # 其他字段}
)
print(res1)# 批量写入
res2 = client.insert(collection_name="test1",data=[{"id": 1, "vector": [0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104], "name": "测试3"},{"id": 2, "vector": [0.43742130801983836, -0.5597502546264526, 0.6457887650909682, 0.7894058910881185, 0.20785793220625592], "name": "测试4"},{"id": 3, "vector": [0.3172005263489739, 0.9719044792798428, -0.36981146090600725, -0.4860894583077995, 0.95791889146345], "name": "测试5"},{"id": 4, "vector": [0.4452349528804562, -0.8757026943054742, 0.8220779437047674, 0.46406290649483184, 0.30337481143159106], "name": "测试6"},{"id": 5, "vector": [0.985825131989184, -0.8144651566660419, 0.6299267002202009, 0.1206906911183383, -0.1446277761879955], "name": "测试7"},{"id": 6, "vector": [0.8371977790571115, -0.015764369584852833, -0.31062937026679327, -0.562666951622192, -0.8984947637863987], "name": "测试8"},{"id": 7, "vector": [-0.33445148015177995, -0.2567135004164067, 0.8987539745369246, 0.9402995886420709, 0.5378064918413052], "name": "测试9"},{"id": 8, "vector": [0.39524717779832685, 0.4000257286739164, -0.5890507376891594, -0.8650502298996872, -0.6140360785406336], "name": "测试10"},{"id": 9, "vector": [0.5718280481994695, 0.24070317428066512, -0.3737913482606834, -0.06726932177492717, -0.6980531615588608], "name": "测试11"}],
)print(res2)

3. search 向量相似查询数据
3.1 向量相似检索
from pymilvus import MilvusClientclient = MilvusClient("http://172.19.222.20:19530")res = client.search(collection_name="test1",data=[[0.05, 0.23, 0.07, 0.45, 0.13]],limit=3,search_params={"metric_type": "L2","params": {}}
)for row in res[0]:print(row)

3.2 向量相似检索 + 过滤
过滤和 SQL 用法类似,通过 filter 字段控制:
from pymilvus import MilvusClientclient = MilvusClient("http://172.19.222.20:19530")res = client.search(collection_name="test1",data=[[0.05, 0.23, 0.07, 0.45, 0.13]],limit=3,filter='name == "测试5" and id > 2',search_params={"metric_type": "L2","params": {}}
)for row in res[0]:print(row)

3.3 向量相似检索 + 模糊查询过滤
模糊查询和 SQL 用法一直,使用 like 。
from pymilvus import MilvusClientclient = MilvusClient("http://172.19.222.20:19530")res = client.search(collection_name="test1",data=[[0.05, 0.23, 0.07, 0.45, 0.13]],limit=3,filter='name == "name like "测试%" and id > 2',search_params={"metric_type": "L2","params": {}}
)for row in res[0]:print(row)

3.4 向量相似检索 + 指定输出字段
通过 output_fields 控制输出字段。
from pymilvus import MilvusClientclient = MilvusClient("http://172.19.222.20:19530")res = client.search(collection_name="test1",data=[[0.05, 0.23, 0.07, 0.45, 0.13]],limit=3,filter='name like "测试%" and id > 2',output_fields=["vector", "name"],search_params={"metric_type": "L2","params": {}}
)for row in res[0]:print(row)

3.5 向量相似检索 + 分页
通过增加 offset + limit 的方式实现:
from pymilvus import MilvusClientclient = MilvusClient("http://172.19.222.20:19530")res = client.search(collection_name="test1",data=[[0.05, 0.23, 0.07, 0.45, 0.13]],limit=3,offset=3,filter='name like "测试%" and id > 2',output_fields=["vector", "name"],search_params={"metric_type": "L2","params": {}}
)for row in res[0]:print(row)

4. query 普通查询数据
query 用法和 search 类似,只是不用传递 data 向量了:
from pymilvus import MilvusClientclient = MilvusClient("http://172.19.222.20:19530")res = client.query(collection_name="test1",filter="id > 1",output_fields=["*"]
)
for row in res:print(row)

5. upsert 插入或更新数据
from pymilvus import MilvusClientclient = MilvusClient("http://172.19.222.20:19530")## 查询 id = 2 的数据
res = client.query(collection_name="test1",filter="id == 2",output_fields=["*"]
)
row = res[0]
print(row)# 修改name为张三
row['name'] = "张三"# 保存修改
client.upsert(collection_name="test1",data=[row]
)
再次查询:
from pymilvus import MilvusClientclient = MilvusClient("http://172.19.222.20:19530")## 查询 id = 2 的数据
res = client.query(collection_name="test1",filter="id == 2",output_fields=["*"]
)
row = res[0]
print(row)

6. delete 删除数据
from pymilvus import MilvusClientclient = MilvusClient("http://172.19.222.20:19530")# 删除 id 为 1、2 的数据
client.delete(collection_name="test1",ids=[1, 2]
)
查询数据:
from pymilvus import MilvusClientclient = MilvusClient("http://172.19.222.20:19530")res = client.query(collection_name="test1",filter="",output_fields=["*"],limit=1000
)
for row in res:print(row)

相关文章:
Milvus 向量数据库介绍及使用
一、Milvus 介绍及安装 Milvus 于 2019 年创建,其目标只有一个:存储、索引和管理由深度神经网络和其他机器学习 (ML) 模型生成的大量嵌入向量。它具备高可用、高性能、易拓展的特点,用于海量向量数据的实时召回。 作为专门为处理输入向量查…...
STP环路避免实验(华为)
思科设备参考:STP环路避免实验(思科) 一,技术简介 Spanning Tree Protocol(STP),即生成树协议,是一种数据链路层协议。主要作用是防止二层环路,并自适应网络变化和故障…...
二、SpringBoot3 配置文件
本章概要 统一配置管理概述属性配置文件使用YAML 配置文件使用批量配置文件注入多环境配置和使用 2.1 统一配置管理概述 SpringBoot工程下,进行统一的配置管理,你想设置的任何参数(端口号、项目根路径、数据库连接信息等等)都集中到一个固定…...
二、阅读器的开发(初始)-- 2、阅读器开发
1、epubjs核心工作原理 1.1 epubjs的核心工作原理解析 epub电子书,会通过epubjs去实例化一个Book对象,Book对象会对电子书进行解析。Book对象可以通过renderTo方法去生成一个Rendition对象,Rendition主要负责电子书的渲染,通过R…...
【QT入门】 Qt自定义信号后跨线程发送信号
往期回顾: 【QT入门】 lambda表达式(函数)详解-CSDN博客 【QT入门】 Qt槽函数五种常用写法介绍-CSDN博客 【QT入门】 Qt实现自定义信号-CSDN博客 【QT入门】 Qt自定义信号后跨线程发送信号 由于Qt的子线程是无法直接修改ui,需要发送信号到ui线程进行修改…...
51单片机学习笔记7 串转并操作方法
51单片机学习笔记7 串转并操作方法 一、串转并操作简介二、74HC595介绍1. **功能**:2. **引脚**:3. **工作原理**:4. 开发板原理图(1)8*8 LED点阵:(2)74HC595 串转并: 三…...
微服务cloud--抱团取暖吗 netflix很多停更了
抱团只会卷,卷卷也挺好的 DDD 高内聚 低耦合 服务间不要有业务交叉 通过接口调用 分解技术实现的复杂性,围绕业务概念构建领域模型;边界划分 业务中台: 数据中台: 技术中台: 核心组件 eureka&#x…...
牛客笔试|美团2024春招第一场【测试方向】
第一题:小美的数组询问 小美拿到了一个由正整数组成的数组,但其中有一些元素是未知的(用 0 来表示)。 现在小美想知道,如果那些未知的元素在区间 [l, r] 范围内随机取值的话,数组所有元素之和的最小值和最大…...
Docker搭建LNMP环境实战(一):前言
缘起:不久前学习了Docker相关知识,并在Docker环境下学习了LNMP环境的搭建。由于网上的文章大多没有翔实、可行的案例,很多文章都是断章取义,所以,期间踩了太多太多的坑,初学者想要真正顺利地搭建一套环境起…...
SCI一区 | Matlab实现PSO-TCN-BiGRU-Attention粒子群算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测
SCI一区 | Matlab实现PSO-TCN-BiGRU-Attention粒子群算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测 目录 SCI一区 | Matlab实现PSO-TCN-BiGRU-Attention粒子群算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测预测效果基本介绍模型描述…...
界面控件DevExpress ASP.NET Ribbon组件 - 完美复刻Office 365体验!
无论用户是喜欢传统工具栏菜单外观、样式,还是想在下一个项目中复制Office 365 web UI,DevExpress ASP.NET都提供了所需要的工具,帮助用户打造更好的应用程序界面。 P.S:DevExpress ASP.NET Web Forms Controls拥有针对Web表单&a…...
vue2【详解】mixins —— 抽离公共逻辑
mixins 用于在 Vue 中便捷复用变量、方法、组件引用、生命周期等 使用方法 创建文件myMixin.js export const myMixin {data() {return {webName: 朝阳的博客}},created() {alert(欢迎来到${this.webName})},methods: {hi() {alert(欢迎来到${this.webName})}} }vue文件中引入…...
ArrayList的常用方法
ArrayList是Java中常用的动态数组类,它提供了一系列用于操作和管理数组的方法。下面是一些ArrayList常用方法的介绍: add()方法:向ArrayList中添加元素,可以指定位置添加元素或者在末尾添加元素。 ArrayList<String> list …...
ES-Hadoop:将Elasticsearch与Hadoop无缝集成的开源工具
hadoop 大数据技术之Hive(3)PyHive pyhdfs ES,Elasticsearch https://zhuanlan.zhihu.com/p/595505475?utm_id0 Hadoop hdfs 、hive、spark https://blog.51cto.com/u_16099278/6901638 ES-Hadoop:将Elasticsearch与Hadoop无缝集成的开源工…...
质量模型、软件测试流程和测试用例
质量模型 衡量一个优秀软件的维度 可以从功能性、性能、兼容性、易用性、安全、可靠性、可维护性、可移植性这几个方面去做软件测试,但咱们在正常测试中一般是选取前五项进行测试 测试流程 1、需求评审:确保各部门对需求的理解一致 2、测试计划编写&a…...
集简云新增“文本语音转换”功能,实现智能语音交互
为丰富人工智能领域的应用集成,为用户提供更便捷和智能化的信息获取和视觉创作方式,本周集简云上线了内置应用—文本语音转换。目前支持OpenAI TTS和TTS HD模型,实现文本语音高效智能转换,也可根据你的产品或品牌创建独特的神经网…...
图像处理领域专业术语
图像处理中的一些常见术语,涵盖了从基础概念到高级处理技术的各个方面。 以下是一些图像处理领域常用的专业术语及其解释: 像素(Pixel): 图像的最基本单元,每个像素都有一个或多个与其关联的数值࿰…...
Microsoft Edge 中的 Internet Explorer 模式解决ie禁止跳转到edge问题
作为网工,网络中存在很老的设备只能用ie浏览器访问打开,但是win10后打开Internet Explorer 会强制跳转到Edge 浏览器,且有人反馈不会关,为此找到了微软官方的Microsoft Edge 中的 Internet Explorer 模式,可以直接在Mi…...
理清大数据技术与架构
大数据并不是一个系统软件,更不是一个单一的软件,它实际上是一种技术体系、一种数据处理方法,甚至可以说是一个服务平台。在这个技术体系中,涵盖了许多不同的部件,比如Hadoop服务平台。这一服务平台可以根据具体情况自…...
小白DB补全计划Day2-LeetCode:SQL基本操作selectJOIN
链接:1683. 无效的推文 - 力扣(LeetCode)1378. 使用唯一标识码替换员工ID - 力扣(LeetCode)1068. 产品销售分析 I - 力扣(LeetCode) 来源:LeetCode 1683 # Write your MySQL quer…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
