文章目录
- 一、简介
- 1. Milvus介绍
- 2. 特征向量是什么?
- 3. 术语表
- 4. 为什么选择使用 Milvus?
- 二、下载&安装
- 1. 安装前提
- 2. 安装
- 1. 单机版
- 2. 分布式版
- 3. 离线安装
- 三、版本管理
- 四、前期准备
- 五、POM引入
- 六、MilvusServiceClient
- 七、常用方法
- 常量类
- 1. hasCollection
- 2. createCollection
- 3. createPartition
- 4. createIndex
- 5. insert
- 6. loadCollection
- 7. loadPartitions
- 8. releaseCollection
- 9. releasePartition
- 10. deleteData
- 11、search
文档地址
Milvus 于 2019 年开源,主要用于存储、索引和管理通过深度神经网络和机器学习模型产生的海量向量数据。
Milvus 向量数据库专为向量查询与检索设计,能够为万亿级向量数据建立索引。与传统关系型数据库不同,Milvus 主要用于自下而上地处理非结构化数据向量。非结构化数据没有统一的预定义模型,因此可以转化为向量。
随着互联网不断发展,电子邮件、论文、物联网传感数据、社交媒体照片、蛋白质分子结构等非结构化数据已经变得越来越普遍。如果想要使用计算机来处理这些数据,需要使用 embedding 技术将这些数据转化为向量。随后,Milvus 会存储这些向量,并为其建立索引。Milvus 能够根据两个向量之间的距离来分析他们的相关性。如果两个向量十分相似,这说明向量所代表的源数据也十分相似。
向量又称为 ,是指由embedding技术从离散变量(如xxx等各种非结构化数据)转变而来的连续向量。在数学表示上,向量是一个由浮点数或者二值型数据组成的 n 维数组。通过现代的向量转化技术,比如各种人工智能(AI)或者机器学习(ML)模型,可以将非结构化数据抽象为 n 维特征向量空间的向量。这样就可以采用最近邻算法(ANN)计算非结构化数据之间的相似度。
- Collection
包含一组 entity,可以等价于关系型数据库系统(RDBMS)中的表。 - Entity
包含一组 field。field 与实际对象相对应。field 可以是代表对象属性的结构化数据,也可以是代表对象特征的向量。primary key 是用于指代一个 entity 的唯一值。
你可以自定义 primary key,否则 Milvus 将会自动生成 primary key。请注意,目前 Milvus 不支持 primary key 去重,因此有可能在一个 collection 内出现 primary key 相同的 entity。
- Field
Entity 的组成部分。Field 可以是结构化数据,例如数字和字符串,也可以是向量。
Milvus 2.0 现已支持标量字段过滤。
- Segment
Milvus 在数据插入时通过合并数据自动创建的数据文件。一个 collection 可以包含多个 segment。一个 segment 可以包含多个 entity。在搜索中,Milvus 会搜索每个 segment,并返回合并后的结果。
- Sharding
Shard 是指将数据写入操作分散到不同节点上,使 Milvus 能充分利用集群的并行计算能力进行写入。默认情况下单个 collection 包含 2 个分片(shard)。目前 Milvus 采用基于主键哈希的分片方式,未来将支持随机分片、自定义分片等更加灵活的分片方式。
Partition 的意义在于通过划定分区减少数据读取,而shard 的意义在于多台机器上并行写入操作。
- Partition
把 collection 中的数据根据一定规则在物理存储上分成多个部分。这种对 collection 数据的划分就叫分区(partitioning)。每个 partition 可包含多个segment。 - 归一化
归一化指的是通过数学变换将向量的模长变为 1 的过程。如需使用点积计算向量相似度,则必须对向量作归一化处理。处理后点积与余弦相似度等价。 - 索引
索引基于原始数据构建,可以提高对 collection 数据搜索的速度。Milvus 支持多种索引类型。 - 向量
一种类型的 field,代表对象的特征。非结构化数据可以通过各种 AI 模型和 embedding 技术转化为向量。
目前,一个实体最多只能包含一个向量。
- 高性能:性能高超,可对海量数据集进行向量相似度检索。
- 高可用、高可靠:Milvus 支持在云上扩展,其容灾能力能够保证服务高可用。
- 混合查询:Milvus 支持在向量相似度检索过程中进行标量字段过滤,实现混合查询。
- 开发者友好:支持多语言、多工具的 Milvus 生态系统。
- Milvus 在构建索引和查询向量时依赖 CPU 对 SIMD (Single Instruction Multiple Data) 扩展指令集合的支持。请确保运行 Milvus 的 CPU 至少支持以下一种 SIMD 指令集合:
- SSE4.2
- AVX
- AVX2
- AVX512
使用 lscpu 命令以检查 CPU 是否支持特定 SIMD 指令集合:
- 检查 Docker 及 Docker Compose 版本
因为官网推荐使用docker-compose安装运行,所以需要检查版本是否合适
- 运行 确认 Docker 版本。建议使用 19.03 或以上版本。
- 运行 确认 Docker Compose 版本。建议使用 1.25.1 或以上版本。
1. 单机版
官网教程
2. 分布式版
官网教程
3. 离线安装
因为我们生产环境是在专网,无法连接到互联网,所以需要离线安装
离线安装说白了就是在有网的机器上把需要的docker镜像下载下来,然后再把镜像导出,再上传到专网服务器
- 根据docker-compose.yml里面内容,把用到的镜像导出
- 下载到本地
下载下来后根据自己的方式把镜像包上传到专网服务器
我们是开发机器可以同时连到两个网,所以通过FTP再上传到专网服务器就好了
- 导入镜像
- 导入docker-compose.yml
把官网教程里下载的docker-compose.yml复制过来就行了
- 启动
- milvus-sdk-java版本
- SpringBoot版本
因为这里用的milvus版本是2.0.0的,但是Maven中央仓库中还没有这个版本的依赖,所以需要到GitHub上面把2.0版本的java-sdk下载到本地,然后编译到本地仓库
地址: https://github.com/milvus-io/milvus-sdk-java
下载下来后会有很多类找不到,这时候只需要clean install一下,有些类是编译之后才会有
如果嫌麻烦可以下我编译好了的:https://www.aliyundrive.com/s/3HZQ1VYaqKB·
需要跟milvus交互都需要调用MilvusServiceClient,我这里的做法是把它定义成一个Bean,需要用到的地方依赖注入
有了MilvusServiceClient后就可以为所欲为了!
下面介绍几个常用方法
用来存放这个集合需用到的参数
判断集合是否已经存在
返回值boolean类型,有(true)/无(false)
创建集合
创建分区 ->
我在这里的做法是先定义了分区总数, 然后循环建立分区,在查询或者插入的时候根据里面的某个值进行取模,分到对应的分区里面去
创建索引
调用 create_index() 方法后,Milvus 会为后续新增向量自动构建索引的任务。每当新增数据量达到一个完整的 segment 时即触发这一任务,Milvus 为新插入的向量构建索引。
新增向量的索引文件与前期构建的索引文件相互独立。
至于选择什么样的索引,见官方文档
数据插入
这里就我自己用的插入代码,因为是按组织ID分区的,所以每个组织分一个组,然后再批量插入,其中的向量值是通过虹软人脸识别SDK计算出来的特征值转换成List,
因为虹软特征值本身就是归一化处理了的,只需要把字节转Float就行了
把集合加载到内存中(milvus查询前必须把数据加载到内存中)
加载分区数据
释放集合(从内存中释放)
释放分区
删除数据
搜索
搜索是支持多个向量值一起搜的,但是我这里做的是搜索相似度最高的那一个,所以我只需要一个返回数据(返回数据是已经按相似度排序了的)