跳到主要内容

BITMAP​

Bitmap index 是一种高效的索引技术,旨在提高低基数标量 field 的查询性能。基数是指 field 中不同值的数量。具有较少不同元素的 field 被认为是低基数的。​

这种 index 类型通过以紧凑的二进制格式表示 field 值并对其执行高效的位运算来帮助减少标量查询的检索时间。与其他类型的 index 相比,bitmap index 在处理低基数 field 时通常具有更高的空间效率和更快的查询速度。​

概述

术语 Bitmap 结合了两个词:BitMap。Bit 表示计算机中最小的数据单位,只能保存 01 的值。在这种上下文中,Map 是指根据应该为 0 和 1 分配什么值来转换和组织数据的过程。​

Bitmap index 由两个主要组件组成:bitmap 和 key。Key 表示索引 field 中的唯一值。对于每个唯一值,都有一个相应的 bitmap。这些 bitmap 的长度等于 collection 中的记录数。Bitmap 中的每个位对应 collection 中的一个记录。如果记录中索引 field 的值与 key 匹配,则相应的位设置为 1;否则,设置为 0。​

考虑一个具有 CategoryPublic field 的文档 collection。我们想要检索属于 Tech 类别且对 Public 开放的文档。在这种情况下,我们的 bitmap index 的 key 是 TechPublic。​

Bitmap indexing

如图所示,CategoryPublic 的 bitmap index 为:​

  • Tech: [1, 0, 1, 0, 0],显示只有第 1 个和第 3 个文档属于 Tech 类别。​

  • Public: [1, 0, 0, 1, 0],显示只有第 1 个和第 4 个文档对 Public 开放。​

要找到符合两个条件的文档,我们对这两个 bitmap 执行按位 AND 操作:​

  • Tech AND Public: [1, 0, 0, 0, 0]​

结果 bitmap [1, 0, 0, 0, 0] 表明只有第一个文档(ID 1)满足两个条件。通过使用 bitmap index 和高效的位运算,我们可以快速缩小搜索范围,无需扫描整个数据集。​

创建 bitmap index

要在 Milvus 中创建 bitmap index,使用 create_index() 方法并将 index_type 参数设置为 "BITMAP"。​

from pymilvus import MilvusClient​

index_params = client.create_index_params() # Prepare an empty IndexParams object, without having to specify any index parameters​
index_params.add_index(
field_name="category", # Name of the scalar field to be indexed​
index_type="BITMAP", # Type of index to be created​
index_name="category_bitmap_index" # Name of the index to be created​
)

client.create_index(
collection_name="my_collection", # Specify the collection name​
index_params=index_params​
)

在此示例中,我们在 my_collection collection 的 category field 上创建 bitmap index。add_index() 方法用于指定 field 名称、index 类型和 index 名称。​

创建 bitmap index 后,您可以在查询操作中使用 filter 参数根据索引 field 执行标量过滤。这允许您使用 bitmap index 高效地缩小搜索结果。有关更多信息,请参阅 元数据过滤。​

限制

  • Bitmap index 仅支持非 primary key 的标量 field。​

  • Field 的数据类型必须是以下类型之一:​

    • BOOLINT8INT16INT32INT64VARCHAR

    • ARRAY(元素必须是以下类型之一:BOOLINT8INT16INT32INT64VARCHAR)​

  • Bitmap index 不支持以下数据类型:​

    • FLOATDOUBLE:浮点类型与 bitmap index 的二进制性质不兼容。​

    • JSON:JSON 数据类型具有复杂的结构,无法使用 bitmap index 高效表示。​

  • Bitmap index 不适用于高基数的 field(即具有大量不同值的 field)。​

    • 一般来说,当 field 的基数小于 500 时,bitmap index 最有效。​

    • 当基数超过此阈值时,bitmap index 的性能优势会减少,存储开销变得显著。​

    • 对于高基数 field,根据您的特定用例和查询要求,考虑使用替代索引技术,如倒排 index。​