Milvus学习整理

news2025/3/24 18:21:12

Milvus学习整理

一、度量类型(metric_type)

二、向量字段和适用场景介绍

三、索引字段介绍

(一)、概述总结

(二)、详细说明

四、简单代码示例

(一)、建立集合和索引示例

(二)、搜索示例

(三)、参考文档

五、数据搜索

(一)、基础搜索参数说明

(二)、范围搜索

1.  概述总结

2.详细说明

(三)、全文搜索 (BM25)

1. 概述

2. 使用全文搜索步骤

(四)、其他搜索

一、度量类型(metric_type)

相似度量用于衡量向量之间的相似性。选择合适的距离度量有助于显著提高分类和聚类性能。

目前,Milvus 支持这些类型的相似性度量:欧氏距离 (L2)、内积 (IP)、余弦相似度 (COSINE)、JACCARD,HAMMING 和BM25 (专门为稀疏向量的全文检索而设计)。

下表总结了所有支持的度量类型的相似性距离值特征及其取值范围。

度量类型

相似性距离值的特征

相似性距离值范围

L2

值越小表示相似度越高。

[0, ∞)

IP

数值越大,表示相似度越高。

[-1, 1]

COSINE

数值越大,表示相似度越高。

[-1, 1]

JACCARD

数值越小,表示相似度越高。

[0, 1]

HAMMING

值越小,表示相似度越高。

0,dim(向量)] [0, dim(vector)

BM25

根据词频、反转文档频率和文档规范化对相关性进行评分。

[0, ∞)

二、向量字段和适用场景介绍

数据类型维度范围支持的度量(metric_type)适用场景

FLOAT_VECTOR

存储 32 位浮点数

2-32,768

COSINE,L2,IP

(默认:CONSINE)

非常适合需要高精度的场景,例如区分相似向量

FLOAT16_VECTOR

存储 16 位半精度浮点数

2-32,768

COSINE,L2,IP

(默认:CONSINE)

在精度要求不高的情况下,如推荐系统的低精度召回阶段,它可以节省存储空间。

BFLOAT16_VECTOR

存储精度降低但指数范围与 Float32 相同的 16 位浮点数

2-32,768

COSINE,L2,IP

(默认:CONSINE)

可在不明显影响精度的情况下降低内存和计算要求。

可用于需要快速处理大量向量的场景,如大规模图像检索。

SPARSE_FLOAT_VECTOR

存储非零元素及其相应索引的列表

无需指定

IP,BM25 (仅用于全文检索)

(默认:IP)

涉及需要精确匹配关键词或短语的应用
BINARY_VECTOR
二进制向量
8-32,768*8

HAMMING,JACCARD

(默认:HAMMING)

用于图像处理或紧凑特征表示

移动设备和嵌入式系统等资源受限的环境中

三、索引字段介绍

(一)、概述总结
  • 创建索引(Flat除外)时:都需要需要指定一些创建参数,如nlist
  • 搜索数据时:可以指定一些索引的搜索参数来提高搜索精度,每种索引都有指定的搜索参数(即如果搜索数据时传入了这种索引不支持的参数,则不会起作用)
(二)、详细说明

下面表格说明了每一种索引的优缺点、构建索引需要指定参数、搜索数据可设置参数以及适用场景

类型描述(概述、优缺点)

索引构建参数

params

搜索参数

场景
FLAT

 不压缩向量是唯一能保证精确搜索结果的索引

采用的是穷举搜索方法,这意味着每次查询都要将目标输入与数据集中的每一组向量进行比较

优点:搜索精度高

缺点:海量数据搜索慢

不需要

search_params中可指定metric_type

如:

search_params = {

“metric_type”:“L2”

}

数据集相对较小(百万级别)

需要 100% 的召回率

IVF_FLAT

将向量数据划分为nlist(群组单位数) 个聚类单元,然后比较目标输入向量与每个聚类中心之间的距离。根据系统设置查询的簇数 (nprobe),相似性搜索结果仅根据目标输入与最相似簇中向量的比较结果返回--大大缩短了查询时间

优点:搜索效率高,支持近似搜索

缺点:搜索精度依赖搜索参数调整

nlist(群组单位数):

默认:128,范围:[1, 65536]

search_params.params中可指定

A:nprobe(要查询的单位数)

 默认:8, 范围:[1,nlist]

B:max_empty_result_buckets

未返回任何搜索结果的桶的最大数量。

这是一个范围搜索参数,当连续空桶的数量达到指定值时,将终止搜索过程。
增加该值可以提高召回率,但代价是增加搜索时间。

如 

search_params = {

"params":{

"nprobe":8

}

}

高速查询

要求尽可能高的召回率

IVF_SQ8

不进行任何压缩,因此它生成的索引文件大小与原始的非索引向量数据大致相同

优点:存储需求低

缺点:搜索精度低

nlist(群组单位数):

默认:128 ,范围:[1, 65536]

A:nprobe(要查询的单位数)

 默认:8, 范围:[1,nlist]

B:max_empty_result_buckets

未返回任何搜索结果的桶的最大数量。

这是一个范围搜索参数,当连续空桶的数量达到指定值时,将终止搜索过程。
增加该值可以提高召回率,但代价是增加搜索时间

如 

search_params = {
    "params": {
        "nprobe": 10,
    }
}

极高速查询

内存资源有限

可接受召回率略有下降

IVF_PQ

将原始高维向量空间均匀分解为 低维向量空间的笛卡尔乘积,然后对分解后的低维向量空间进行量化,大大降低了算法的时间复杂度和空间复杂度

A. nlist(群组单位数):

默认:128 ,范围:[1, 65536]

B. m(乘积量化因子数):

范围:dim mod m == 0

C. nbits(每个低维向量的存储位数)

[1,64] (默认为 8)

A:nprobe(要查询的单位数)

 默认:8, 范围:[1,nlist]

 如 

search_params = {
    "params": {
        "nprobe": 10, 
    }
}

  • 高速查询
  • 内存资源有限
  • 可略微降低召回率
HNSW

是一种基于图的索引算法。它根据一定的规则为图像建立多层导航结构

优点:高性能,高维数据效果良好

缺点:

A. M(定义图形中传出连接的最大数量)

在固定 ef/efConstruction 条件下,M 越大,精度/运行时间越长,范围[2, 2048]

B. ef_construction控制索引搜索速度/构建速度的权衡。增加 efConstruction 参数可能会提高索引质量,但也会延长索引编制时间。

范围:[1,int_max]

ef:控制查询时间/准确性权衡的参数。ef 越高,搜索越准确,但速度越慢

范围:[top_k, int_max]

如:

search_params = {
    "params": {
        "ef": 10
    }
}

  • 极高速查询
  • 要求尽可能高的召回率
  • 内存资源大

四、简单代码示例

(一)、建立集合和索引示例

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中指定radiusrang_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内圈半径,画出两个同心圆

所有相似度得分在这两个同心圆形成的环形区域内的向量都将被返回

上图显示,范围搜索请求包含两个参数:radiusrange_filter。收到范围搜索请求后,Milvus 会执行以下操作。

  • 使用指定的度量类型metric_type:consine)查找与查询向量最相似的所有向量嵌入。

  • 过滤与查询向量的距离得分radiusrange_filter参数指定范围内的向量嵌入。

  • 从筛选出的实体中返回前 limit个实体。

设置 radius range_filter的方法因搜索的度量类型metric_type而异。下表列出了在不同度量类型下设置这两个参数的要求。

度量类型

名称

L2

L2 距离越小,表示相似度越高。

IP

IP 距离越大,表示相似度越高。

COSINE

COSINE 距离越大,表示相似度越高。

JACCARD

Jaccard 距离越小,表示相似度越高。

HAMMING

汉明距离越小,表示相似度越高。

from pymilvus import MilvusClient

client = 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. 使用全文搜索步骤

要使用全文搜索,请遵循以下主要步骤。

  1. 创建 Collections:设置一个带有必要字段的 Collections,并定义一个将原始文本转换为稀疏嵌入的函数。

  2. 插入数据:将原始文本文档插入 Collections。

  3. 执行搜索:使用查询文本搜索你的 Collections 并检索相关结果。

from pymilvus import MilvusClient, DataType, Function, FunctionType

client = 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 字段的名称a
    output_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
)









(四)、其他搜索

分组搜索

混合搜索

过滤操作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2320192.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL事务全解析:从概念到实战

在数据库操作中&#xff0c;事务是一个至关重要的概念&#xff0c;它确保了数据的完整性和一致性。今天&#xff0c;就让我们深入探讨MySQL事务的方方面面&#xff0c;从基础概念到实际应用&#xff0c;全面掌握这一技能。 一、为什么需要事务 假设张三要给李四转账100元&…

手机怎么换网络IP有什么用?操作指南与场景应用‌

在数字化时代&#xff0c;手机已经成为我们日常生活中不可或缺的一部分&#xff0c;无论是工作、学习还是娱乐&#xff0c;手机都扮演着至关重要的角色。而在手机的使用过程中&#xff0c;网络IP地址作为设备在互联网上的唯一标识符&#xff0c;其重要性和作用不容忽视。本文将…

科技赋能安全:慧通测控的安全带全静态性能测试

汽车的广泛普及给人们的出行带来了极大便利&#xff0c;但交通事故频发也成为严重的社会问题。据世界卫生组织统计&#xff0c;全球每年约有 135 万人死于道路交通事故&#xff0c;而安全带在减少事故伤亡方面起着不可替代的作用。正确使用安全带可使前排驾乘人员的死亡风险降低…

记录修复一个推拉门滑轮

推拉门有个滑轮的固定螺丝不知什么时候掉了&#xff0c;也找不到&#xff0c;这就导致推拉门卡在轨道上。 这种滑轮在夕夕上很便宜&#xff0c;比哈罗单车还划算&#xff0c;但是现在缺的只是螺丝&#xff0c;如果买就会多出来一个轮… 这种螺丝比较长&#xff0c;大概是m4的…

压缩壳学习

壳是什么 壳就是软件的一个保护套&#xff0c;防止软件被进行反编译或被轻易地修改。 其作用就是为了保护软件。 常见的大类壳有压缩壳、加密壳、VM 壳的分类。 压缩壳顾名思义就是用来减小软件的文件大小的&#xff1b;加密壳&#xff0c;通过加密软件来保护软件&#xff…

深入理解 Linux ALSA 音频架构:从入门到驱动开发

文章目录 一、什么是 ALSA?二、ALSA 系统架构全景图核心组件详解:三、用户空间开发实战1. PCM 音频流操作流程2. 高级配置(asound.conf)四、内核驱动开发指南1. 驱动初始化模板2. DMA 缓冲区管理五、高级主题1. 插件系统原理2. 调试技巧3. 实时音频优化六、现代 ALSA 发展七…

CCF-CSP认证 202206-2寻宝!大冒险!

题目描述 思路 有一张绿化图和藏宝图&#xff0c;其中绿化图很大&#xff08;二维数组在限定的空间内无法存储&#xff09;&#xff0c;而藏宝图是绿化图中的一部分&#xff0c;对于绿化图和藏宝图&#xff0c;左下角的坐标为(0, 0)&#xff0c;右上角的坐标是(L, L)、(S, S)&…

仿函数 VS 函数指针实现回调

前提&#xff1a; 本博客对比 函数指针实现回调 和 仿函数 &#xff0c;突出仿函数的优势。 目的&#xff1a; 一个类要能够灵活的调用两个函数&#xff0c;essfc 和 greaterfc&#xff0c;分别用于比较两个整数的大小&#xff1a; ①&#xff1a;lessfc&#xff1a;判断 x …

MQTT的安装和使用

MQTT的安装和使用 在物联网开发中&#xff0c;mqtt几乎已经成为了广大程序猿必须掌握的技术&#xff0c;这里小编和大家一起学习并记录一下~~ 一、安装 方式1、docker安装 官网地址 https://www.emqx.com/zh/downloads-and-install/broker获取 Docker 镜像 docker pull e…

PRODIGY: “不折腾人”的蛋白-蛋白/蛋白-小分子结合能计算工具

PRODIGY&#xff08;全称为 PROtein binDIng enerGY prediction&#xff09;是一种蛋白质结合能预测工具&#xff0c;可利用蛋白质-蛋白质复合物的三维结构来预测其结合亲和力。PRODIGY 利用一种高效的基于接触的方法&#xff0c;在估计结合自由能和解离常数的同时&#xff0c;…

C++之 【模板初阶(函数模板与类模板)】

目录 1.泛型编程 2.模板 3函数模板 3.1函数模板的概念 3.2函数模板的格式 3.3函数模板的原理 3.4函数模板的实例化 3.4.1隐式实例化&#xff1a;让编译器根据实参推演模板参数的实际类型 3.4.2显示实例化&#xff1a;在函数名后的<>中指定模板参数的实际类型 3.…

在线教育网站项目第四步:deepseek骗我, WSL2不能创建两个独立的Ubuntu,但我们能实现实例互访及外部访问

一、说明 上一章折腾了半天&#xff0c;搞出不少问题&#xff0c;今天我们在deepseek的帮助下&#xff0c;完成多个独立ubuntu24.04实例的安装&#xff0c;并完成固定ip&#xff0c;实践证明&#xff0c;deepseek不靠谱&#xff0c;浪费我2个小时时间&#xff0c;我们将在下面实…

在刀刃上发力:如何精准把握计划关键节点

关键路径分析是项目管理中的一种重要方法&#xff0c;它通过在甘特图中识别出项目中最长、最关键的路径&#xff0c;来确定项目的最短完成时间。 关键路径上的任务都是项目成功的关键因素&#xff0c;任何延误都可能导致整个项目的延期。关键路径分析对于项目管理者来说至关重要…

组合总和||

1.给定一个数组 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用一次。 #include <bits/stdc.h> using namespace std; vector<vector<int>> result; vec…

OpenCV图像拼接(2)基于羽化(feathering)技术的图像融合算法拼接类cv::detail::FeatherBlender

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::detail::FeatherBlender 是 OpenCV 中用于图像拼接的一个类&#xff0c;它属于 stitching 模块的一部分。这个类实现了基于羽化&#xff08;…

DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加导出数据功能示例9,TableView15_09带排序的导出表格示例

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

spring boot 登入权限RBAC模式

首先准备好5张表 user_info表&#xff0c;用户的信息表 role表&#xff0c;角色表&#xff08;比如超级管理员、管理员、审核员、采购......&#xff09; 创建user_role表&#xff0c;user_info表&#xff0c;role表的中间表 注意了&#xff0c;role_id和user_id是 u…

调用API拿到的值——存储方式

1.响应结果示例&#xff1a; "purposeTagList":["稳中向好及进中提质"] 2.数据库中定义的 3.值的获取&#xff1a; F1 JsonNode purposeTagListNode dataNode.path("purposeTagList");if (purposeTagListNode.isArray()) {StringBuilder purp…

第一讲 | 解锁C++编程能力:基础语法解析

C入门基础 一、C的第一个程序二、命名空间三、C输入&输出四、缺省参数/默认参数五、函数重载六、引用1.引用的特性2.引用的使用引用做返回值场景 3.const引用只有指针和引用涉及权限放大、缩小的问题&#xff0c;普通变量没有 4.指针和引用的关系 七、inline八、nullptr 一…

C++ --- 多态

1 多态的概念 多态(polymorphism)的概念&#xff1a;通俗来说&#xff0c;就是多种形态。多态分为编译时多态(静态多态)和运⾏时多 态(动态多态)&#xff0c;这⾥我们重点讲运⾏时多态&#xff0c;编译时多态(静态多态)和运⾏时多态(动态多态)。编译时 多态(静态多态)主要就是我…