milvus向量数据库(Milvus vector database)
type
status
date
slug
summary
tags
category
icon
password
第一章 Milvus概述
Milvus创建于2019年,唯一的目标是:存储、索引和管理由深度神经网络和其他机器学习(ML)模型生成的大量嵌入向量embedding vectors。
存储对象:向量
Milvus能够通过计算两个向量的相似距离来分析它们之间的相关性,如果两个嵌入向量非常相似,则意味着原始数据源也是相似的。
1.1相关应用
- 图像相似性搜索:图像可搜索,并立即从海量数据库中返回最相似的图像。
- 视频相似度搜索:通过将关键帧转换为向量,然后将结果输入Milvus,可以近乎实时地搜索和推荐数十亿个视频。
- 音频相似度搜索:快速查询语音、音乐、音效、表面相似声音等海量音频数据。
- 分子相似性搜索:对特定分子进行快速相似性搜索、子结构搜索或上层结构搜索。
- 推荐系统:推荐
官网:https://milvus.io/bootcamp/
1.2Milvus是如何设计的?
作为一个云原生矢量数据库,Milvus通过设计分离了存储和计算。为了增强弹性和灵活性,Milvus中的所有组件都是无状态的。
该系统分为四个层次:
- 访问层:访问层由一组无状态代理组成,作为系统的前端层和用户的端点。
- 协调服务:协调服务将任务分配给工作节点,并发挥系统大脑的作用。
- 工作节点:工作节点就像手臂和腿,是哑执行器,遵循协调器服务的指令,执行用户触发的DML/DDL命令。
- 存储:存储是系统的骨架,负责数据持久性。它包括元存储、日志
有关更多信息,请参见体系结构概述Architecture Overview.
1.3开发者工具
Milvus由丰富的api和工具支持,以促进DevOps。
Milvus有包装在Milvus API之上的客户端库,可用于从应用程序代码中以编程方式插入、删除和查询数据。
PyMilvus
Node.js SDK
Go SDK
Java SDK
第二章 快速开始
2.1安装Milvus
使用docker-compose安装
Milvus Standalone
【第一步】下载
milvus-standalone-docker-compose.yml
,并保存为docker-compose.yml
https://github.com/milvus-io/milvus/releases/download/v2.2.3/milvus-standalone-docker-compose.yml
linux
【第二步】在与
docker-compose.yml
相同的目录中,启动所有docker-compose
服务并后台运行【第三步】展示当前
docker-compose
编排过的运行的所有容器停止服务
停止Milvus后删除数据,执行
第三章 学习
前提下载:PyMilvus 2.2.2
3.1Manage Milvus Connections (连接管理)
如何连接和断开Milvus服务器
milvus支持两个端口:19530、9091
- gRPC支持19530端口
它是连接不同Milvus sdk的Milvus服务器时的默认端口。
- RESTful API支持9091端口
当使用HTTP客户端连接到Milvus服务器时使用它。
连接Milvus服务器
建立一个Milvus连接。在进行任何操作之前,请确保连接到Milvus服务器。
示例代码:
Parameter | Description |
alias | 要构造的Milvus连接的别名。 |
host | Milvus服务器IP地址。 |
port | Milvus服务器端口。 |
返回值:由传递的参数创建的Milvus连接
NOTE:最大连接数为65,536。
Milvus服务器断开连接
示例代码:
Parameter | Description |
alias | 要断开连接的Milvus服务器的别名。 |
3.2Manage Collections(集合管理)
要创建的集合必须包含一个主键字段和一个向量字段。主键字段支持的数据类型为INT64和String。
Prepare Schema(准备schema)
首先,准备参数,包括field schema, collection schema, and collection name.、
示例代码:
Parameter | Description | Option |
FieldSchema | 要创建的集合中的字段的模式。 | N/A |
name | 要创建的字段的名称 | N/A |
dtype | 要创建的字段的数据类型。 | DataType.INT64 、DataType.VARCHAR 、DataType.BOOL 、DataType.INT64``DataType.FLOAT 、DataType.DOUBLE BINARY_VECTOR FLOAT_VECTOR |
is_primary 主键字段为必选项 | 要创建的字段是否为主键 | True or False |
auto_id (主键字段为必选项) | 启用或禁用自动ID(主键)分配。 | True or False |
max_length (VARCHAR字段的必填项) | 允许插入的最大字符串长度。 | [1, 65,535] |
dim (向量字段是必须的) | 向量的维数。 | [1, 32,768] |
description (可选) | 字段的描述。 | N/A |
CollectionSchema | 要创建的集合的模式。 | N/A |
fields | 要创建的集合的字段。 | N/A |
description (可选) | 要创建的集合的描述。 | N/A |
collection_name | 要创建的集合的名称。 | N/A |
Create a collection(创建集合)
示例代码:
Parameter | Description | Option |
using 可选 | 通过在这里指定服务器别名,选择在哪个Milvus服务器中创建集合。 | N/A |
shards_num 可选 | 要创建的集合的碎片数。 | [1,256] |
properties: collection.ttl.seconds 可选 | TTL (Collection time to live)是收集的过期时间。过期集合中的数据将被清理,并且不会涉及到搜索或查询。TTL以秒为单位。 | 该值应该为0或更大。0表示关闭TTL。 |
限制
Feature | Maximum limit |
Length of a collection name | 255 characters |
Number of partitions in a collection | 4,096 |
Number of fields in a collection | 64 |
Number of shards in a collection | 256 |
Modify a collection(修改集合)
示例代码:
TTL (Collection time to live)是集合中数据的过期时间。集合中过期的数据将被清理,并且不会涉及到搜索或查询。TTL以秒为单位。该值应该为0或更大。缺省值为0,即关闭TTL功能。
Check Collection Information(核对集合信息)
检查是否存在集合
检查集合的具体信息
列出这个Milvus实例中的所有集合。
Drop a collection(删除一个集合)
Collection Alias(集合别名)
集合别名管理;别名的长度不能超过255个字符
创建集合别名
删除集合别名
更改集合别名
Load a Collection(加载一个集合)
将集合加载到内存中;Milvus中的所有搜索和查询操作都在内存中执行。
示例代码:
Parameter | Description |
partition_name (optional) | 要加载的分区名称 |
replica_number (optional) | 要加载的副本的编号 |
获取副本信息
Release a Collection(释放一个集合)
从内存中释放集合,以减少内存使用。
示例代码:
3.3Manage Partitions(分区管理)
Create a Partition(创建一个分区)
Milvus允许将大量矢量数据划分为少量的分区,然后可以将搜索和其他操作限制在一个分区上,以提高性能。
集合由一个或多个分区组成。在创建一个新集合时,Milvus创建了一个默认分区
_default
。集合中的分区数不能超过4096
示例:在集合book中构建分区novel。
Check Partition Information(核对分区信息)
1)检查是否存在分区
collection.has_partition()
2)列出所有分区
collection.partitions
Drop Partitions(删除分区)
删除指定集合中的分区
Parameter | Description |
partition_name | 要删除的分区的名称。 |
Load a Partition(加载分区)
将分区加载到内存
将分区而不是整个集合加载到内存中可以显著降低内存使用,Milvus中的所有搜索和查询操作都在内存中执行。
Parameter | Description |
partition_name | 分区名称。 |
replica_number (optional) | 要加载的副本的编号。 |
Get replica information(获取副本信息)
示例代码:
Release a Partition(释放分区)
在执行搜索或查询操作后,将分区从内存中释放,以减少对内存的占用。
示例代码:
Parameter | Description |
partition_name | 分区的名称 |
3.4Manage Data(数据管理)
Insert Entities(插入实体)
Prepare data(准备数据)
首先,准备要插入的数据。要插入的数据的数据类型必须与集合的模式匹配,否则Milvus将引发异常。
Insert data to Milvus(数据存储)
指定
partition_name
,选择将数据插入哪个分区。Parameter | Description |
data | Data to insert into Milvus. |
partition_name (optional) | 要插入数据的分区名称。 |
Delete Entities(删除实体)
Milvus支持通过布尔表达式过滤的主键删除实体。
Prepare boolean expression
Milvus只支持删除带有明确指定主键的实体,这可以通过术语
in
实现其他运算符只能用于向量搜索中的查询或标量过滤。
下面的示例过滤主键值为0和1的数据。
Delete entities
删除满足布尔表达式的实体。Milvus返回已删除实体的ID列表。
Parameter | Description |
expr | 布尔表达式,指定要删除的实体。 |
partition_name (optional) | 删除实体的分区名称。 |
3.5Manage Indexes(索引管理)
Build an Index on Vectors
向量索引是元数据的组织单位,用于加速向量相似性搜索。如果没有建立在向量上的索引,Milvus将默认执行暴力搜索。
下面的例子用欧几里得距离(L2)作为相似度度量来构建一个1024个集群的IVF_FLAT索引。
更多的相似度测量:https://milvus.io/docs/metric.md
Prepare index parameter
参数说明:
1)metric_type 用于度量向量相似性的度量类型。
- 浮点向量
L2
(Euclidean distance) 欧几里得距离IP
(Inner product) 内积(即点积)
- 二进制向量
JACCARD
(Jaccard distance) 杰卡德距离TANIMOTO
(Tanimoto distance) Tanimoto距离HAMMING
(Hamming distance) 海明距离SUPERSTRUCTURE
(Superstructure)SUBSTRUCTURE
(Substructure)
2)index_type 用于加速向量搜索的索引类型。
- 浮点向量
FLAT
(FLAT)IVF_FLAT
(IVF_FLAT)IVF_SQ8
(IVF_SQ8)IVF_PQ
(IVF_PQ)HNSW
(HNSW)ANNOY
(ANNOY)DISKANN*
(DISK_ANN)
- 二进制向量
BIN_FLAT
(BIN_FLAT)BIN_IVF_FLAT
(BIN_IVF_FLAT)
3)params
针对索引构建参数,请参阅内存索引和磁盘索引。See In-memory Index and On-disk Index for more information.
Build index
针对向量字段构建索引
通过指定向量字段名和索引参数来构建索引。
Parameter | Description |
field_name | 要在其上构建索引的向量字段的名称。 |
index_params | 要构建的索引的参数。 |
Build an Index on Scalars
针对标量构建索引。
不像向量,向量有大小和方向,标量只有大小。Milvus将单个数字和字符串视为标量。下面是Milvus中标量字段可用数据类型的列表。
为了加快混合搜索中的属性过滤,从Milvus v2.1.0开始,可以在标量字段上构建索引。
Build index
针对标量构建索引
要在标量字段上构建索引,不需要设置任何索引参数。标量字段索引名的默认值为default_idx。您可以将它设置为另一个合适的值。
下面的代码片段假设一个名为
book
的集合已经存在,并且要在字符串字段book_name
上创建索引。一旦创建了索引,可以在向量相似度搜索中包含一个布尔表达式:
Drop an Index(删除一个索引)
示例代码:
3.6Search And Query
Conduct a Vector Similarity Search(向量相似度搜索)
Milvus中的向量相似搜索,计算查询向量与集合中具有指定相似度量的向量之间的距离,并返回最相似的结果。通过指定筛选标量字段或主键字段的布尔表达式【boolean expression 】,您可以执行混合搜索【 hybrid search 】,甚至使用Time Travel【 Time Travel】进行搜索。
Load collection 加载集合
Milvus中的所有搜索和查询操作都在内存中执行。在进行向量相似性搜索之前,将集合加载到内存中。
Prepare search parameters 准备查询参数
准备适合搜索场景的参数。
下面的示例定义了搜索策略,使用欧几里得距离计算距离,并从IVF_FLAT索引构建的10个最近的群集中检索向量。
Parameter | Description |
metric_type | 用于度量向量的相似性策略。See Simlarity Metrics for more information. |
params | 特定于索引的搜索参数. See Vector Index for more information. |
Conduct a vector search 执行向量查询
若要在特定分区 partition中搜索,请指定分区名称列表。
Parameter | Description |
data | 用于搜索的向量 |
anns_field | 要搜索的字段的名称。 |
param | 特定于索引的搜索参数。See Vector Index for more information. |
offset | 返回集中要跳过的结果数。这个值和“limit”的和应该小于16384。 |
limit | 数最相似的结果返回。这个值和offset的和应该小于16384。 |
expr | 用于过滤属性的布尔表达式. See Boolean Expression Rules for more information. |
partition_names (optional) | 要搜索的分区的名称列表。 |
output_fields (optional) | 要返回的字段的名称。当前版本不支持向量字段。 |
timeout (optional) | 允许RPC的持续时间(以秒为单位)。当设置为None时,客户端等待服务器响应或发生错误。 |
round_decimal (optional) | 返回距离的小数位数 |
consistency_level (optional) | 搜索的一致性级别。 |
检查最相似向量的主键值及其距离。
释放在Milvus中加载的集合,以减少搜索完成时的内存消耗。
Conduct a Hybrid Search(混合搜索)
混合搜索本质上是带有属性过滤的向量搜索,通过指定过滤标量字段或主键字段的布尔表达式,可以用某些条件限制搜索。
Load collection(加载集合)
Conduct a hybrid vector search(执行混合向量搜索)
通过指定布尔表达式,可以在向量搜索期间过滤实体的标量字段。
示例代码:将搜索范围限制为指定的word_count值范围内的向量。
NOTE:
collection.search
返回结果为 SearchResult对象,一个可迭代的2d数组类,其第一个维度是要查询的向量数(nq),第二个维度是极限数(topk)。Conduct a Vector Query(向量查询)
与向量相似度搜索不同,向量查询通过基于布尔表达式的标量过滤来检索向量。Milvus支持标量字段中的许多数据类型和各种布尔表达式。布尔表达式对标量字段或主键字段进行筛选,并检索与筛选器匹配的所有结果。
Load collection(加载集合)
Conduct a vector query(执行向量查询)
3.7Similarity Metrics
在Milvus中,相似性度量用于度量向量之间的相似性。选择一个好的距离度量有助于显著提高分类和聚类性能。下表显示了这些广泛使用的相似性度量如何与各种输入数据形式和Milvus索引相匹配。
欧式距离(L2)
其中,a = (a1, a2,…), an) 、b = (b1, b2,…, bn)是n维欧几里德空间中的两个点。
适用于连续性数据
内积(IP)
两个向量之间的内积定义如下:
其中A和B是向量。
Last update: 2023-07-14
type
status
date
slug
summary
tags
category
icon
password
这里是关于我笔记,希望你能获取到你想要的知识 🧐