当前位置: 首页 > news >正文

Milvus 向量数据库介绍及使用

一、Milvus 介绍及安装

Milvus2019 年创建,其目标只有一个:存储、索引和管理由深度神经网络和其他机器学习 (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 的数据持久化。

需要提前安装好 DockerDocker-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 使用

MilvusPython Api 版本对应如下:

Milvus 版本推荐的 PyMilvus 版本
1.0.*1.0.1
1.1.*1.1.2
2.0.x2.0.2
2.1.x2.1.3
2.2.x2.2.3
2.3.02.3.7
2.4.0-rc.12.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量化操作, 准确率和速度的平衡
IVFinverted 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中常用的动态数组类&#xff0c;它提供了一系列用于操作和管理数组的方法。下面是一些ArrayList常用方法的介绍&#xff1a; add()方法&#xff1a;向ArrayList中添加元素&#xff0c;可以指定位置添加元素或者在末尾添加元素。 ArrayList<String> list …...

ES-Hadoop:将Elasticsearch与Hadoop无缝集成的开源工具

hadoop 大数据技术之Hive&#xff08;3&#xff09;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&#xff1a;将Elasticsearch与Hadoop无缝集成的开源工…...

质量模型、软件测试流程和测试用例

质量模型 衡量一个优秀软件的维度 可以从功能性、性能、兼容性、易用性、安全、可靠性、可维护性、可移植性这几个方面去做软件测试&#xff0c;但咱们在正常测试中一般是选取前五项进行测试 测试流程 1、需求评审&#xff1a;确保各部门对需求的理解一致 2、测试计划编写&a…...

集简云新增“文本语音转换”功能,实现智能语音交互

为丰富人工智能领域的应用集成&#xff0c;为用户提供更便捷和智能化的信息获取和视觉创作方式&#xff0c;本周集简云上线了内置应用—文本语音转换。目前支持OpenAI TTS和TTS HD模型&#xff0c;实现文本语音高效智能转换&#xff0c;也可根据你的产品或品牌创建独特的神经网…...

图像处理领域专业术语

图像处理中的一些常见术语&#xff0c;涵盖了从基础概念到高级处理技术的各个方面。 以下是一些图像处理领域常用的专业术语及其解释&#xff1a; 像素&#xff08;Pixel&#xff09;&#xff1a; 图像的最基本单元&#xff0c;每个像素都有一个或多个与其关联的数值&#xff0…...

Microsoft Edge 中的 Internet Explorer 模式解决ie禁止跳转到edge问题

作为网工&#xff0c;网络中存在很老的设备只能用ie浏览器访问打开&#xff0c;但是win10后打开Internet Explorer 会强制跳转到Edge 浏览器&#xff0c;且有人反馈不会关&#xff0c;为此找到了微软官方的Microsoft Edge 中的 Internet Explorer 模式&#xff0c;可以直接在Mi…...

理清大数据技术与架构

大数据并不是一个系统软件&#xff0c;更不是一个单一的软件&#xff0c;它实际上是一种技术体系、一种数据处理方法&#xff0c;甚至可以说是一个服务平台。在这个技术体系中&#xff0c;涵盖了许多不同的部件&#xff0c;比如Hadoop服务平台。这一服务平台可以根据具体情况自…...

小白DB补全计划Day2-LeetCode:SQL基本操作selectJOIN

链接&#xff1a;1683. 无效的推文 - 力扣&#xff08;LeetCode&#xff09;1378. 使用唯一标识码替换员工ID - 力扣&#xff08;LeetCode&#xff09;1068. 产品销售分析 I - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 1683 # Write your MySQL quer…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案

引言 在分布式系统的事务处理中&#xff0c;如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议&#xff08;2PC&#xff09;通过准备阶段与提交阶段的协调机制&#xff0c;以同步决策模式确保事务原子性。其改进版本三阶段提交协议&#xff08;3PC&#xf…...

DAY 26 函数专题1

函数定义与参数知识点回顾&#xff1a;1. 函数的定义2. 变量作用域&#xff1a;局部变量和全局变量3. 函数的参数类型&#xff1a;位置参数、默认参数、不定参数4. 传递参数的手段&#xff1a;关键词参数5 题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一…...

数据结构:泰勒展开式:霍纳法则(Horner‘s Rule)

目录 &#x1f50d; 若用递归计算每一项&#xff0c;会发生什么&#xff1f; Horners Rule&#xff08;霍纳法则&#xff09; 第一步&#xff1a;我们从最原始的泰勒公式出发 第二步&#xff1a;从形式上重新观察展开式 &#x1f31f; 第三步&#xff1a;引出霍纳法则&…...