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 自动为支持的数据类型(如 VARCHAR、INT 等)创建索引,无需手动干预。在执行搜索时,仅需构造包含布尔表达式的查询条件,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 向量相似性搜索增添了强大的筛选能力,使得在处理具有大量标量属性的数据集时,查询性能显著提升。通过选择适当的索引类型和合理的配置,您可以在搜索精度和查询效率之间找到理想的平衡点,满足复杂数据处理场景的业务需求。

相关推荐
咬代码的兽1 小时前
满大街的 AI Agent,怎么判断真假?五个土办法
ai编程·ai agent·agentagent
sell-cloud1 小时前
Prompt Engineering要凉了?Fable 5.5能“猜“意图,但银行正在封杀AI Agent——企业AI的真正护城河是什么
人工智能·prompt
Navicat中国3 小时前
Navicat 18 内置 AI 助手让数据库开发从繁琐操作迈向智能协作
大数据·人工智能·数据库开发
4SAPI3 小时前
多模型请求路由怎么设计?成本、速度和能力如何平衡
人工智能·python·gateway·php
魔乐社区3 小时前
翼芯・智算测试与适配优化专区,让国产算力“选得准、跑得通、用得好“
人工智能·开源·大模型
XCDoris5 小时前
郴州logo设计机构
大数据·人工智能·python
Goboy5 小时前
一个人带三个Agent,我用全新TRAE从0到1搭了个资讯周刊站
人工智能·trae
俊哥V5 小时前
每日 AI 研究简报 · 2026-10-19
人工智能·ai
AI_AGENT_DEV_AI5 小时前
AI英语教培智能体的开发
人工智能