标量索引
Milvus 支持将标量字段和向量字段组合进行过滤搜索。为了提高涉及标量字段的搜索效率,Milvus 从 2.1.0 版本开始引入了标量字段索引。本文概述了 Milvus 中的标量字段索引,帮助你了解其重要性和实现方式。
概览
在 Milvus 中进行向量相似性搜索时,你可以使用逻辑运算符将标量字段组织成布尔表达式。
当 Milvus 接收到一个带有布尔表达式的搜索请求时,它会将布尔表达式解析为一个抽象语法树(AST),以生成用于属性过滤的物理执行计划。然后 Milvus 在每个段中应用物理执行计划,生成一个 位图 作为过滤结果,并将结果作为向量搜索参数包含在内,以缩小搜索范围。在这种情况下,向量搜索的速度主要取决于属性过滤的速度。
标量字段索引是一种通过以特定方式对标量字段值进行排序来加速信息检索,以确保属性过滤的速度的方法。
标量字段索引算法
Milvus 旨在通过其标量字段索引算法实现低内存使用量、高过滤效率和短加载时间。这些算法分为两种主要类型:默认索引 和 倒排索引。
默认索引
Milvus 会根据标量字段的数据类型自动创建一个默认索引,无需手动干预。这种默认索引适用于前缀匹配查询和频繁检索场景。
以下表格列出了 Milvus 支持的各种数据类型及其对应的默认索引算法。
数据类型 | 默认索引算法 |
---|---|
VARCHAR | MARISA-trie |
INT8 | STL 排序 |
INT16 | STL 排序 |
INT32 | STL 排序 |
INT64 | STL 排序 |
FLOAT | STL 排序 |
DOUBLE | STL 排序 |
倒排索引
倒排索引是一种更灵活的方法,你可以通过指定索引参数来手动创建一个标量字段的倒排索引。这种方法适用于各种场景,包括点查询、模式匹配查询、全文搜索、JSON 搜索、布尔搜索,甚至是前缀匹配查询。
倒排索引由词典和倒排列表组成。词典包含了按字母顺序排列的所有标记化词,而倒排列表则包含了每个词所出现的文档列表。这种结构通过减少时间复杂度与暴力搜索相比,使得诸如点查询和范围查询之类的操作非常高效。
使用倒排索引的优点特别在以下操作中表现出来:
- 点查询:例如,当搜索包含单词 Milvus 的文档时,该过程首先检查词典中是否存在 Milvus。如果没有找到,则表示没有文档包含该词。但是,如果找到了,则检索与 Milvus 相关联的倒排列表,指示包含该词的文档。与在百万个文档中进行暴力搜索相比,这种方法要高效得多,因为排序后的词典极大地减少了查找词 Milvus 所需的时间复杂度。
- 范围查询:利用排序后的词典,可以提高范围查询(例如查找字母顺序大于 very 的文档)的效率。这种方法比暴力搜索更高效,提供更快、更准确的结果。
性能建议
为了充分利用 Milvus 在标量字段索引方面的能力,并发掘其在向量相似性搜索中的潜力,你可能需要一个模型来根据你拥有的数据估计所需的内存大小。
以下表格列出了 Milvus 支持的所有数据类型的估计函数。
-
数值字段
数据类型 内存估计函数(MB) INT8 numOfRows * * 12* / 1024 / 1024 INT16 numOfRows * * 12* / 1024 / 1024 INT32 numOfRows * * 12* / 1024 / 1024 INT64 numOfRows * * 24* / 1024 / 1024 FLOAT32 numOfRows * * 12* / 1024 / 1024 DOUBLE numOfRows * * 24* / 1024 / 1024 -
字符串字段
字符串长度 内存估计函数(MB) (0, 8] numOfRows * * 128* / 1024 / 1024 (8, 16] numOfRows * * 144* / 1024 / 1024 (16, 32] numOfRows * * 160* / 1024 / 1024 (32, 64] numOfRows * * 192* / 1024 / 1024 (64, 128] numOfRows * * 256* / 1024 / 1024 (128, 65535] numOfRows * * strLen * 1.5* / 1024 / 1024