Milvus学习整理
Milvus学习整理
一、度量类型(metric_type)
二、向量字段和适用场景介绍
三、索引字段介绍
(一)、概述总结
(二)、详细说明
四、简单代码示例
(一)、建立集合和索引示例
(二)、搜索示例
(三)、参考文档
五、数据搜索
(一)、基础搜索参数说明
(二)、范围搜索
1. 概述总结
2.详细说明
(三)、全文搜索 (BM25)
1. 概述
2. 使用全文搜索步骤
(四)、其他搜索
一、度量类型(metric_type)
相似度量用于衡量向量之间的相似性。选择合适的距离度量有助于显著提高分类和聚类性能。
目前,Milvus 支持这些类型的相似性度量:欧氏距离 (L2)、内积 (IP)、余弦相似度 (COSINE)、JACCARD,HAMMING 和BM25 (专门为稀疏向量的全文检索而设计)。
下表总结了所有支持的度量类型的相似性距离值特征及其取值范围。
| 度量类型 | 相似性距离值的特征 | 相似性距离值范围 |
|---|---|---|
|
| 值越小表示相似度越高。 | [0, ∞) |
|
| 数值越大,表示相似度越高。 | [-1, 1] |
|
| 数值越大,表示相似度越高。 | [-1, 1] |
|
| 数值越小,表示相似度越高。 | [0, 1] |
|
| 值越小,表示相似度越高。 | 0,dim(向量)] [0, dim(vector) |
|
| 根据词频、反转文档频率和文档规范化对相关性进行评分。 | [0, ∞) |
二、向量字段和适用场景介绍
| 数据类型 | 维度范围 | 支持的度量(metric_type) | 适用场景 |
| FLOAT_VECTOR 存储 32 位浮点数 | 2-32,768 |
| 非常适合需要高精度的场景,例如区分相似向量 |
| FLOAT16_VECTOR 存储 16 位半精度浮点数 | 2-32,768 |
| 在精度要求不高的情况下,如推荐系统的低精度召回阶段,它可以节省存储空间。 |
| BFLOAT16_VECTOR 存储精度降低但指数范围与 Float32 相同的 16 位浮点数 | 2-32,768 |
| 可在不明显影响精度的情况下降低内存和计算要求。 可用于需要快速处理大量向量的场景,如大规模图像检索。 |
| SPARSE_FLOAT_VECTOR 存储非零元素及其相应索引的列表 | 无需指定 |
| 涉及需要精确匹配关键词或短语的应用 |
| BINARY_VECTOR 二进制向量 | 8-32,768*8 |
| 用于图像处理或紧凑特征表示 移动设备和嵌入式系统等资源受限的环境中 |
三、索引字段介绍
(一)、概述总结
- 创建索引(Flat除外)时:都需要需要指定一些创建参数,如nlist
- 搜索数据时:可以指定一些索引的搜索参数来提高搜索精度,每种索引都有指定的搜索参数(即如果搜索数据时传入了这种索引不支持的参数,则不会起作用)
(二)、详细说明
下面表格说明了每一种索引的优缺点、构建索引需要指定参数、搜索数据可设置参数以及适用场景
| 类型 | 描述(概述、优缺点) | 索引构建参数 params | 搜索参数 | 场景 |
|---|---|---|---|---|
| FLAT | 不压缩向量是唯一能保证精确搜索结果的索引 采用的是穷举搜索方法,这意味着每次查询都要将目标输入与数据集中的每一组向量进行比较 优点:搜索精度高 缺点:海量数据搜索慢 | 不需要 | search_params中可指定metric_type 如: | 数据集相对较小(百万级别) 需要 100% 的召回率 |
| IVF_FLAT | 将向量数据划分为 优点:搜索效率高,支持近似搜索 缺点:搜索精度依赖搜索参数调整 | nlist(群组单位数): 默认:128,范围:[1, 65536] | search_params.params中可指定 A:nprobe(要查询的单位数) 默认:8, 范围:[1,nlist] B:max_empty_result_buckets 未返回任何搜索结果的桶的最大数量。 这是一个范围搜索参数,当连续空桶的数量达到指定值时,将终止搜索过程。 如 | 高速查询 要求尽可能高的召回率 |
| IVF_SQ8 | 不进行任何压缩,因此它生成的索引文件大小与原始的非索引向量数据大致相同 优点:存储需求低 缺点:搜索精度低 | nlist(群组单位数): 默认:128 ,范围:[1, 65536] | A:nprobe(要查询的单位数) 默认:8, 范围:[1,nlist] B:max_empty_result_buckets 未返回任何搜索结果的桶的最大数量。 这是一个范围搜索参数,当连续空桶的数量达到指定值时,将终止搜索过程。 如 | 极高速查询 内存资源有限 可接受召回率略有下降 |
| IVF_PQ | 将原始高维向量空间均匀分解为 低维向量空间的笛卡尔乘积,然后对分解后的低维向量空间进行量化,大大降低了算法的时间复杂度和空间复杂度 | A. nlist(群组单位数): 默认:128 ,范围:[1, 65536] B. m(乘积量化因子数): 范围:dim mod m == 0 C. nbits(每个低维向量的存储位数) [1,64] (默认为 8) | A:nprobe(要查询的单位数) 默认:8, 范围:[1,nlist] 如 |
|
| HNSW | 是一种基于图的索引算法。它根据一定的规则为图像建立多层导航结构 优点:高性能,高维数据效果良好 缺点: | A. M(定义图形中传出连接的最大数量) 在固定 ef/efConstruction 条件下,M 越大,精度/运行时间越长,范围[2, 2048] B. ef_construction控制索引搜索速度/构建速度的权衡。增加 efConstruction 参数可能会提高索引质量,但也会延长索引编制时间。 范围:[1,int_max] | ef:控制查询时间/准确性权衡的参数。 范围:[ 如: |
|
四、简单代码示例
(一)、建立集合和索引示例
client = MilvusClient(uri="http://127.0.0.1:19530",db_name="test_embedding")
schema = client.create_schema(auto_id=False,enable_dynamic_field=False,)schema.add_field(field_name="id",datatype=DataType.INT64,is_primary=True,auto_id=True)schema.add_field(field_name="embedding_content",datatype=DataType.FLOAT_VECTOR,dim=1024)schema.add_field(field_name="content",datatype=DataType.VARCHAR,max_length=65535)index_params = client.prepare_index_params()index_params.add_index(field_name="id",index_type="STL_SORT")index_params.add_index(field_name="embedding_content", index_type="FLAT",metric_type="IP",params={ "nlist": 1024 })if "embedding_collection" not in client.list_collections():print("create collection")client.create_collection(collection_name="embedding_collection", schema=schema,index_params=index_params)
(二)、搜索示例
# 这里的搜索参数,需要根据创建的向量索引字段的类型,再结合上面表格对应的搜索参数进行设置search_params = {"metric_type":"IP","params":{#召回率设置"nprobe":128,#保留相似度大于radius的"radius":0.6}}search_res = client.search(collection_name="embedding_collection",data=[query_embedding],search_params=search_params,output_fields=["id", "content"])
(三)、参考文档
Flat建立和搜索索引文档
IVF_FLAT建立和搜索索引文档
IVF_PQ 建立和搜索索引文档
HNSW建立和搜索索引文档
五、数据搜索
(一)、基础搜索参数说明
query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]
client.search(collection_name="my_collection",anns_field="vector",data=[query_vector],limit=3,output_fields=["color"],search_params={"metric_type": "IP", "offset": 10 }
)
- collection_name:集合名称
- anns_field:向量字段名称
- data:查询向量,可以是多个查询向量,如
query_vectors = [[0.041732933, 0.013779674, -0.027564144, -0.013061441, 0.009748648],[0.0039737443, 0.003020432, -0.0006188639, 0.03913546, -0.00089768134] ]当是多个查询向量时,返回的也是多维数组,如
[[{"id": 551,"distance": 0.08821295201778412,"entity": {}},{"id": 552,"distance": 0.08821295201778412,"entity": {}}],[{"id": 56,"distance": 0.08821295201778412,"entity": {}},{"id": 52,"distance": 0.08821295201778412,"entity": {}}] ] -
limit:单次搜索中返回实体的最大数量,通常称为top-K
-
offset:跳过的数量,设置为已经返回的实体总数
-
output_fields:输出的字段名称集
-
metric_type:使用那种度量类型来计算查询向量与 Collections 中向量的相似度
(二)、范围搜索
1. 概述总结
- 范围搜索可将返回实体的距离或得分限制在特定范围内,从而提高搜索结果的相关性。
- 需要再search_params.params中指定radius和rang_filter的值,如
search_params={# highlight-start"params": {"radius": 0.4,"range_filter": 0.6}# highlight-end}
- 如果正确设置值:
IP和CONSINE:距离越大越相似,所以如果要返回相似度高且在某个范围之间的则需要保证 radius < range_filter
L2及其他:距离越小越相似,所以如果要返回相似度高且在某个范围之间的则需要保证 radius > range_filter
2.详细说明
执行范围搜索请求时, 搜索结果中与查询向量最相似的向量为圆心
以搜索请求中指定的半径radius为外圈半径,以range_filter为内圈半径,画出两个同心圆。
所有相似度得分在这两个同心圆形成的环形区域内的向量都将被返回。

上图显示,范围搜索请求包含两个参数:radius和range_filter。收到范围搜索请求后,Milvus 会执行以下操作。
-
使用指定的度量类型(metric_type:consine)查找与查询向量最相似的所有向量嵌入。
-
过滤与查询向量的距离或得分在radius和range_filter参数指定范围内的向量嵌入。
-
从筛选出的实体中返回前 limit个实体。
设置 radius 和range_filter的方法因搜索的度量类型metric_type而异。下表列出了在不同度量类型下设置这两个参数的要求。
| 度量类型 | 名称 |
|---|---|
|
| L2 距离越小,表示相似度越高。 |
|
| IP 距离越大,表示相似度越高。 |
|
| COSINE 距离越大,表示相似度越高。 |
|
| Jaccard 距离越小,表示相似度越高。 |
|
| 汉明距离越小,表示相似度越高。 |
from pymilvus import MilvusClientclient = MilvusClient(uri="http://localhost:19530",token="root:Milvus"
)query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]res = client.search(collection_name="my_collection",data=[query_vector],limit=3,search_params={# highlight-start"params": {"radius": 0.4,"range_filter": 0.6}# highlight-end}
)for hits in res:print("TopK results:")for hit in hits:print(hit)
(三)、全文搜索 (BM25)
1. 概述
全文搜索是一种在文本数据集中检索包含特定术语或短语的文档,然后根据相关性对结果进行排序的功能。该功能克服了语义搜索可能会忽略精确术语的局限性,确保您获得最准确且与上下文最相关的结果。此外,它还通过接受原始文本输入来简化向量搜索,自动将您的文本数据转换为稀疏嵌入,而无需手动生成向量嵌入。
该功能使用 BM25 算法进行相关性评分,在检索增强生成 (RAG) 场景中尤为重要,它能优先处理与特定搜索词密切匹配的文档。
通过将全文检索与基于语义的密集向量搜索相结合,可以提高搜索结果的准确性和相关性。

2. 使用全文搜索步骤
要使用全文搜索,请遵循以下主要步骤。
-
创建 Collections:设置一个带有必要字段的 Collections,并定义一个将原始文本转换为稀疏嵌入的函数。
-
插入数据:将原始文本文档插入 Collections。
-
执行搜索:使用查询文本搜索你的 Collections 并检索相关结果。
from pymilvus import MilvusClient, DataType, Function, FunctionTypeclient = MilvusClient(uri="http://localhost:19530")# 第一步 创建 Schema 并添加必要的字段。
schema = client.create_schema()schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True, auto_id=True)
#存储原始文本数据,用于全文搜索操作,设置enable_analyzer=True 以允许 Milvus 对文本进行标记化
schema.add_field(field_name="text", datatype=DataType.VARCHAR, max_length=1000, enable_analyzer=True)
#矢量字段,用于存储内部生成的稀疏嵌入,以进行全文搜索操作
schema.add_field(field_name="sparse", datatype=DataType.SPARSE_FLOAT_VECTOR)# 第二步 定义一个将文本转换为稀疏向量表示的函数,然后将其添加到 Schema 中
bm25_function = Function(name="text_bm25_emb", # 函数名称input_field_names=["text"], # 需要将文本转换为稀疏向量的VARCHAR 字段的名称aoutput_field_names=["sparse"], # 存储内部生成的稀疏向量的字段名称function_type=FunctionType.BM25, # 要使用的函数类型。将值设为FunctionType.BM25
)schema.add_function(bm25_function)# 第三步 配置索引index_params = client.prepare_index_params()index_params.add_index(field_name="sparse",index_name="sparse_inverted_index",index_type="SPARSE_INVERTED_INDEX", # 要创建的索引类型。SPARSE_INVERTED_INDEX 是稀疏向量的推荐索引类型metric_type="BM25",#该参数的值必须设置为BM25 ,以专门用于全文搜索功能。params={"inverted_index_algo": "DAAT_MAXSCORE"}, # 索引构建和查询所使用的算法。有效值:DAAT_MAXSCORE、DAAT_WAND、TAAT_NAIVE
)# 第四步 创建 Collections,插入数据
client.create_collection(collection_name='demo', schema=schema, index_params=index_params
)
client.insert('demo', [{'text': 'information retrieval is a field of study.'},{'text': 'information retrieval focuses on finding relevant information in large datasets.'},{'text': 'data mining and information retrieval overlap in research.'},
])# 第五步 执行全文搜索
search_params = {'params': {'drop_ratio_search': 0.2}, # 搜索时要忽略的低重要性词语的比例
}client.search(collection_name='demo', data=['whats the focus of information retrieval?'], # 原始查询文本。anns_field='sparse', # 存储内部生成的稀疏嵌入的字段名称limit=3,search_params=search_params
)
(四)、其他搜索
分组搜索
混合搜索
过滤操作
相关文章:
Milvus学习整理
Milvus学习整理 一、度量类型(metric_type) 二、向量字段和适用场景介绍 三、索引字段介绍 (一)、概述总结 (二)、详细说明 四、简单代码示例 (一)、建立集合和索引示例 (二)…...
MySQL事务全解析:从概念到实战
在数据库操作中,事务是一个至关重要的概念,它确保了数据的完整性和一致性。今天,就让我们深入探讨MySQL事务的方方面面,从基础概念到实际应用,全面掌握这一技能。 一、为什么需要事务 假设张三要给李四转账100元&…...
重叠构造函数 、JavaBean模式、建造者模式、Spring的隐性大手
构造函数 重叠构造函数JavaBean模式建造者模式构造Spring看起来为什么简单番外篇为什么在JavaBean中 无参构造函数是必须的呢 小结 构造函数对我来讲是很平常的一个东西,今天来谈谈新的收获。 重叠构造函数 通常我们定义好实体类后,不会特意的去调整构造…...
题单:精挑细选
题目描述 小王是公司的仓库管理员,一天,他接到了这样一个任务:从仓库中找出一根钢管。这听起来不算什么,但是这根钢管的要求可真是让他犯难了,要求如下: 1.1. 这根钢管一定要是仓库中最长的; …...
GGUF 和 llama.cpp 是什么关系
这是个非常关键的问题,咱们来细说下:GGUF 和 llama.cpp 是什么关系,它们各自干什么,如何配合工作。 🔧 一、llama.cpp 是什么? llama.cpp 是 Meta 的开源大语言模型 LLaMA(Language Model from…...
手机怎么换网络IP有什么用?操作指南与场景应用
在数字化时代,手机已经成为我们日常生活中不可或缺的一部分,无论是工作、学习还是娱乐,手机都扮演着至关重要的角色。而在手机的使用过程中,网络IP地址作为设备在互联网上的唯一标识符,其重要性和作用不容忽视。本文将…...
强化学习中的深度卷积神经网络设计与应用实例
I. 引言 强化学习(Reinforcement Learning,RL)是机器学习的一个重要分支,通过与环境的交互来学习最优策略。深度学习,特别是深度卷积神经网络(Deep Convolutional Neural Networks,DCNNs&#…...
软考程序员-操作系统基本知识核心考点和知识重点总结
以下是软考程序员考试中操作系统基本知识章节的核心考点和知识重点总结,结合历年真题和考试大纲整理而成: 一、操作系统基本概念与功能 定义与作用 操作系统是管理计算机软硬件资源的核心系统软件,负责协调程序执行、优化资源利用,…...
思源配置阿里云 OSS 踩坑记
按照正常的配置IAM,赋予OSS权限,思源笔记还是无法使用,缺少ListBuckets权限。 正常配置权限,又无法覆盖,因此需要手动配置权限。 {"Version": "1","Statement": [{"Effect":…...
科技赋能安全:慧通测控的安全带全静态性能测试
汽车的广泛普及给人们的出行带来了极大便利,但交通事故频发也成为严重的社会问题。据世界卫生组织统计,全球每年约有 135 万人死于道路交通事故,而安全带在减少事故伤亡方面起着不可替代的作用。正确使用安全带可使前排驾乘人员的死亡风险降低…...
记录修复一个推拉门滑轮
推拉门有个滑轮的固定螺丝不知什么时候掉了,也找不到,这就导致推拉门卡在轨道上。 这种滑轮在夕夕上很便宜,比哈罗单车还划算,但是现在缺的只是螺丝,如果买就会多出来一个轮… 这种螺丝比较长,大概是m4的…...
压缩壳学习
壳是什么 壳就是软件的一个保护套,防止软件被进行反编译或被轻易地修改。 其作用就是为了保护软件。 常见的大类壳有压缩壳、加密壳、VM 壳的分类。 压缩壳顾名思义就是用来减小软件的文件大小的;加密壳,通过加密软件来保护软件ÿ…...
深入理解 Linux ALSA 音频架构:从入门到驱动开发
文章目录 一、什么是 ALSA?二、ALSA 系统架构全景图核心组件详解:三、用户空间开发实战1. PCM 音频流操作流程2. 高级配置(asound.conf)四、内核驱动开发指南1. 驱动初始化模板2. DMA 缓冲区管理五、高级主题1. 插件系统原理2. 调试技巧3. 实时音频优化六、现代 ALSA 发展七…...
#13【CVPR2024】“不确定性不是敌人”:深入剖析多模态融合中的不确定性
📜 Embracing Unimodal Aleatoric Uncertainty for Robust Multimodal Fusion 本文没有源码,适合基础好的读者 🍞 1:研究背景与问题定义 🍫 1.1 多模态融合的黄金承诺与现实落差 在人工智能的迅猛发展浪潮中,多模态学习(Multimodal Learning)扮演着越来越重要的角…...
使用 QR-Code-Styling 在 Vue 3 中生成二维码
使用 QR-Code-Styling 在 Vue 3 中生成二维码 1. 前言 二维码广泛应用于网站跳转、支付、身份认证等场景。普通的二维码较为单调,而 qr-code-styling 允许我们自定义二维码的颜色、Logo、样式,使其更具个性化。本文将介绍如何在 Vue 3 Element Plus 中…...
CCF-CSP认证 202206-2寻宝!大冒险!
题目描述 思路 有一张绿化图和藏宝图,其中绿化图很大(二维数组在限定的空间内无法存储),而藏宝图是绿化图中的一部分,对于绿化图和藏宝图,左下角的坐标为(0, 0),右上角的坐标是(L, L)、(S, S)&…...
Redis项目:秒杀业务(优化)
当用户发起请求,此时会请求nginx,nginx会访问到tomcat,而tomcat中的程序,会进行串行操作,分成如下几个步骤 1、查询优惠卷 2、判断秒杀库存是否足够 3、查询订单 4、校验是否是一人一单 5、扣减库存 6、创建订单…...
《Gradio Python 客户端入门》
《Gradio Python 客户端入门》 Gradio Python 客户端使将任何 Gradio 应用程序用作 API 变得非常容易。例如,考虑这个 Hugging Face Space,它转录从麦克风录制的音频文件。 使用该库,我们可以轻松地将 Gradio 用作 API 以编程方式转录音频文…...
仿函数 VS 函数指针实现回调
前提: 本博客对比 函数指针实现回调 和 仿函数 ,突出仿函数的优势。 目的: 一个类要能够灵活的调用两个函数,essfc 和 greaterfc,分别用于比较两个整数的大小: ①:lessfc:判断 x …...
MQTT的安装和使用
MQTT的安装和使用 在物联网开发中,mqtt几乎已经成为了广大程序猿必须掌握的技术,这里小编和大家一起学习并记录一下~~ 一、安装 方式1、docker安装 官网地址 https://www.emqx.com/zh/downloads-and-install/broker获取 Docker 镜像 docker pull e…...
网络工程师考试详细介绍,讲解,备考方案
一、考试科目与形式 1. 科目1:基础知识(计算机与网络知识) - 考试形式:机考,75道选择题(含5道英文题),满分75分 - 核心内容: - 计算机系统:硬件组成&…...
ROS melodic 安装 python3 cv_bridge
有时候,我们需要处理这些兼容性问题。此处列举我的过程,以供参考 mkdir -p my_ws_py39/src cd my_ws_py39 catkin_make_isolated-DPYTHON_EXECUTABLE/usr/bin/python3 \-DPYTHON_INCLUDE_DIR/usr/include/python3.8 \-DPYTHON_LIBRARY/usr/lib/x86_64-l…...
SHELL练习01
判断一个数是奇数还是偶数 要求: 编写一个 Shell 脚本,用户输入一个整数,判断该数是奇数还是偶数,并输出结果。 [rootnode test01]# touch Determine parity.sh [rootnode test01]# vim Determine parity.sh 还有 2 个文件等待…...
PRODIGY: “不折腾人”的蛋白-蛋白/蛋白-小分子结合能计算工具
PRODIGY(全称为 PROtein binDIng enerGY prediction)是一种蛋白质结合能预测工具,可利用蛋白质-蛋白质复合物的三维结构来预测其结合亲和力。PRODIGY 利用一种高效的基于接触的方法,在估计结合自由能和解离常数的同时,…...
C++之 【模板初阶(函数模板与类模板)】
目录 1.泛型编程 2.模板 3函数模板 3.1函数模板的概念 3.2函数模板的格式 3.3函数模板的原理 3.4函数模板的实例化 3.4.1隐式实例化:让编译器根据实参推演模板参数的实际类型 3.4.2显示实例化:在函数名后的<>中指定模板参数的实际类型 3.…...
博弈论中的均衡精炼:完美贝叶斯均衡、序贯均衡与颤抖手均衡详解
博弈论中的均衡精炼:完美贝叶斯均衡、序贯均衡与颤抖手均衡详解 1. 引言:为什么需要均衡精炼? 在博弈论中,纳什均衡是分析策略互动的核心工具,但其存在一个显著缺陷:无法排除不合理的均衡。例如࿰…...
在线教育网站项目第四步:deepseek骗我, WSL2不能创建两个独立的Ubuntu,但我们能实现实例互访及外部访问
一、说明 上一章折腾了半天,搞出不少问题,今天我们在deepseek的帮助下,完成多个独立ubuntu24.04实例的安装,并完成固定ip,实践证明,deepseek不靠谱,浪费我2个小时时间,我们将在下面实…...
在刀刃上发力:如何精准把握计划关键节点
关键路径分析是项目管理中的一种重要方法,它通过在甘特图中识别出项目中最长、最关键的路径,来确定项目的最短完成时间。 关键路径上的任务都是项目成功的关键因素,任何延误都可能导致整个项目的延期。关键路径分析对于项目管理者来说至关重要…...
组合总和||
1.给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用一次。 #include <bits/stdc.h> using namespace std; vector<vector<int>> result; vec…...
OpenCV图像拼接(2)基于羽化(feathering)技术的图像融合算法拼接类cv::detail::FeatherBlender
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::detail::FeatherBlender 是 OpenCV 中用于图像拼接的一个类,它属于 stitching 模块的一部分。这个类实现了基于羽化(…...
