Milvus - 标量字段索引技术解析

概述

在大规模向量相似性搜索场景中,结合标量字段和向量字段的过滤搜索需求日益增加。Milvus 2.1.0 版本引入的标量字段索引,为此类查询提供了极大的性能提升。本文将探讨 Milvus 的标量字段索引技术,包括其原理、实现方法、使用场景及性能优势。

为什么选择标量字段索引?

当在 Milvus 中进行向量相似性搜索时,可能希望通过一些标量字段(例如,数值、字符串字段)来进行筛选,以实现更精准的搜索结果。例如,在图像检索中,可以根据图片上传日期等标量字段来筛选结果。然而,标量字段过滤的效率直接影响最终查询的速度。为了解决这一瓶颈,Milvus 引入了标量字段索引,它可以有效组织标量字段的数据,并结合倒排索引、自动索引等技术,极大提升查询效率。

标量字段索引的工作原理

在接收到带有布尔表达式的搜索请求时,Milvus 会将表达式解析为抽象语法树(AST),并生成对应的物理计划。然后,Milvus 在每个数据段中执行物理计划,生成比特集作为过滤结果,再将此结果用于向量搜索参数,以缩小搜索范围。

1. 标量字段索引的分段过滤

标量字段索引的作用在于加速分段内的属性过滤过程。它以特定方式对标量字段值进行排序,使得信息检索速度大大提升。Milvus 提供了两种主要的标量字段索引算法:自动索引和反转索引。

2. 自动索引与反转索引

  • 自动索引:适用于频繁检索、前缀匹配等查询。Milvus 可以基于标量字段的数据类型自动创建索引,无需手动干预。
  • 反转索引:提供了手动配置的灵活性,适合更复杂的场景,如点查询、模式匹配、全文检索、布尔搜索和 JSON 查询。
自动索引的数据类型支持
数据类型 自动索引算法
VARCHAR 反转索引
INT8 反转索引
INT16 反转索引
INT32 反转索引
INT64 反转索引
FLOAT 反转索引
二进制 反转索引
反转索引的优势

Milvus 中的反转索引由 Tantivy(一个高效的全文搜索引擎库)支持。Tantivy 确保了 Milvus 的反转索引在性能和速度上的优越性。反转索引由术语字典和倒排列表两部分组成,其中术语字典是按字母顺序排列的所有标记词列表,而倒排列表记录每个词所关联的文档。这样设计让反转索引在点查询和范围查询中比暴力搜索快得多。

  • 点查询:通过在术语字典中查找关键字并获取相关倒排列表,避免了大量无效遍历。
  • 范围查询:利用已排序的术语字典更快速地定位符合条件的内容,进一步加速检索过程。

Milvus 中标量字段索引的使用

在 Milvus 中使用标量字段索引可以显著提高带有标量字段筛选的查询性能,以下是一些常见的使用方法和参数配置。

1. 配置自动索引

Milvus 自动为支持的数据类型(如 VARCHARINT 等)创建索引,无需手动干预。在执行搜索时,仅需构造包含布尔表达式的查询条件,Milvus 会自动处理索引。

python 复制代码
# 假设我们有一个字符串和整型标量字段
search_params = {
    "bool_expr": "age > 30 AND status == 'active'"
}
results = collection.search(data=query_vectors, anns_field="embedding", param=search_params, limit=top_K)

2. 手动配置反转索引

反转索引支持更灵活的查询需求,适合点查询、前缀匹配、范围查询等操作。通过反转索引可在 Milvus 中手动配置标量字段的索引。

python 复制代码
# 使用倒排索引来支持复杂的查询场景
index_params = {
    "field_name": "attribute_field",
    "index_type": "INVERTED_INDEX"
}
collection.create_index(index_params=index_params)

3. 查询示例

一旦标量字段索引构建完毕,可以通过以下方式进行点查询和范围查询。

python 复制代码
# 点查询:根据某个值精确匹配
point_query = "category == 'Electronics'"
results = collection.search(data=query_vectors, anns_field="embedding", bool_expr=point_query, limit=top_K)

# 范围查询:查找某个范围内的数据
range_query = "price > 500 AND price < 1000"
results = collection.search(data=query_vectors, anns_field="embedding", bool_expr=range_query, limit=top_K)

标量索引性能测试结果

为了验证标量字段索引的性能优势,实验对比了倒排索引和暴力搜索的性能表现。实验在包含 100 万条记录的数据集上进行测试,结果表明:

  • 点查询:使用倒排索引的查询性能比暴力搜索快 30 倍。
  • 范围查询:使用倒排索引在大数据集上的性能提升更加显著。

这些结果表明,倒排索引在大规模数据场景中提供了更高效的查询性能。

性能建议

使用 Milvus 标量字段索引时,可以根据数据类型和数据量,估算所需的内存大小,以更好地进行资源规划。以下为不同数据类型的内存估算公式:

数值字段

数据类型 内存估算函数(MB)
INT8 行数 * 12 / 1024 / 1024
INT16 行数 * 12 / 1024 / 1024
INT32 行数 * 12 / 1024 / 1024
INT64 行数 * 24 / 1024 / 1024
FLOAT32 行数 * 12 / 1024 / 1024
二进制 行数 * 24 / 1024 / 1024

字符串字段

字符串长度 内存估算函数(MB)
(0, 8] 行数 * 128 / 1024 / 1024
(8, 16] 行数 * 144 / 1024 / 1024
(16, 32] 行数 * 160 / 1024 / 1024
(32, 64] 行数 * 192 / 1024 / 1024
(64, 128] 行数 * 256 / 1024 / 1024
(128, 65535] 行数 * strLen * 1.5 / 1024 / 1024

结论

标量字段索引为 Milvus 向量相似性搜索增添了强大的筛选能力,使得在处理具有大量标量属性的数据集时,查询性能显著提升。通过选择适当的索引类型和合理的配置,您可以在搜索精度和查询效率之间找到理想的平衡点,满足复杂数据处理场景的业务需求。

相关推荐
n***859421 分钟前
一键AI换脸软件,支持表情控制,唇形同步Facefusion-3.0.0发布!支持N卡和CPU,一键启动包
人工智能·github·开源软件
超甜的布丁mm30 分钟前
【图像检测】深度学习与传统算法的区别(识别逻辑、学习能力、泛化能力)
图像处理·人工智能·python·深度学习·算法·视觉检测·卷积神经网络
夏沫の梦44 分钟前
生成式AI对产业的影响与冲击
人工智能·自然语言处理·chatgpt·llama
King's King1 小时前
蜜雪冰城也入局智慧物流,包括智能控制系统集成、机器人研发销售,开始招兵买马了...
大数据·人工智能·机器人
罗小罗同学1 小时前
医学AI公开课·第一期|Machine Learning&Transformers in Med AI
人工智能·机器学习·医学人工智能·公开课
AI完全体2 小时前
【AI战略思考12】调整战略目标,聚焦数据分析,学习德川家康,剩者为王
人工智能·学习·数据分析·数据科学·找工作
说私域2 小时前
社交电商专业赋能高校教育与产业协同发展:定制开发AI智能名片及2+1链动商城小程序的创新驱动
大数据·人工智能·小程序
fanxiaohui121382 小时前
浪潮信息自动驾驶框架AutoDRRT 2.0,赋能高阶自动驾驶
运维·服务器·网络·人工智能·机器学习·金融·自动驾驶
威化饼的一隅3 小时前
【多模态】Flamingo模型技术学习
人工智能·深度学习·计算机视觉·大模型·多模态·多模态模型·flamingo
草梅友仁3 小时前
2024 年第 48 周草梅周报:AI 编程工具 Cursor 试用和 AI 对程序员的影响
chatgpt·aigc·openai