BITMAP
Bitmap index 是一种高效的索引技术,旨在提高低基数标量 field 的查询性能。基数是指 field 中不同值的数量。具有较少不同元素的 field 被认为是低基数的。
这种 index 类型通过以紧凑的二进制格式表示 field 值并对其执行高效的位运算来帮助减少标量查询的检索时间。与其他类型的 index 相比,bitmap index 在处理低基数 field 时通常具有更高的空间效率和更快的查询速度。
概述
术语 Bitmap 结合了两个词:Bit 和 Map。Bit 表示计算机中最小的数据单位,只能保存 0 或 1 的值。在这种上下文中,Map 是指根据应该为 0 和 1 分配什么值来转换和组织数据的过程。
Bitmap index 由两个主要组件组成:bitmap 和 key。Key 表示索引 field 中的唯一值。对于每个唯一值,都有一个相应的 bitmap。这些 bitmap 的长度等于 collection 中的记录数。Bitmap 中的每个位对应 collection 中的一个记录。如果记录中索引 field 的值与 key 匹配,则相应的位设置为 1;否则,设置为 0。
考虑一个具有 Category 和 Public field 的文档 collection。我们想要检索属于 Tech 类别且对 Public 开放的文档。在这种情况下,我们的 bitmap index 的 key 是 Tech 和 Public。
如图所示,Category 和 Public 的 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 的数据类型必须是以下类型之一:
-
BOOL
、INT8
、INT16
、INT32
、INT64
、VARCHAR
-
ARRAY
(元素必须是以下类型之一:BOOL
、INT8
、INT16
、INT32
、INT64
、VARCHAR
)
-
-
Bitmap index 不支持以下数据类型:
-
FLOAT
、DOUBLE
:浮点类型与 bitmap index 的二进制性质不兼容。 -
JSON
:JSON 数据类型具有复杂的结构,无法使用 bitmap index 高效表示。
-
-
Bitmap index 不适用于高基数的 field(即具有大量不同值的 field)。
-
一般来说,当 field 的基数小于 500 时,bitmap index 最有效。
-
当基数超过此阈值时,bitmap index 的性能优势会减少,存储开销变得显著。
-
对于高基数 field,根据您的特定用例和查询要求,考虑使用替代索引技术,如倒排 index。
-