位圖索引
位圖索引是一種有效率的索引技術,設計用來改善低卡片性標量欄位的查詢效能。Cardinality 指的是欄位中不同值的數量。具有較少不同元素的欄位被視為低卡片性。
此索引類型以精簡的二進位格式表示欄位值,並對其執行有效的位運算,有助於縮短標量值查詢的檢索時間。與其他類型的索引相比,位元圖索引在處理低心數欄位時,通常具有更高的空間效率和更快的查詢速度。
概述
Bitmap一詞由兩個字組合而成:Bit和Map。位元代表電腦中最小的資料單位,只能容納0或1 的值。在此上下文中,映射是指根據 0 和 1 應該被指定什麼值來轉換和組織資料的過程。
位圖索引由兩個主要部分組成:位圖和鍵。鍵代表索引欄位中的唯一值。每個唯一值都有一個對應的位元圖。這些位元圖的長度等於集合中記錄的數量。位圖中的每個位元對應集合中的一筆記錄。如果記錄中索引欄位的值與關鍵相符,對應的位就會被設定為1;否則就會被設為0。
考慮一個具有Category和Public 欄位的文件集合。我們要擷取屬於Tech類別且開放給Public 的文件。在這種情況下,我們的位圖索引的鍵是Tech和Public。
位圖
如圖所示,Category和Public的位圖索引為
Tech:[1, 0, 1, 0, 0],這表示只有第 1 和第 3 個文件屬於Tech類別。
Public:[1, 0, 0, 1, 0],表示只有第 1 和第 4 個文件對公眾開放。
為了找出符合這兩個條件的文件,我們在這兩個位元圖上執行位相 AND 運算:
- TechANDPublic:[1, 0, 0, 0, 0]
結果位圖 [1, 0, 0, 0, 0] 表示只有第一個文件(ID 1) 符合這兩個條件。透過使用位元圖索引和有效率的位元運算,我們可以快速縮小搜尋範圍,而不需要掃描整個資料集。
建立位圖索引
要在 Milvus 中建立位圖索引,請使用create_index() 方法,並將index_type 參數設定為"BITMAP" 。
from pymilvus import MilvusClient
client = MilvusClient(
uri="http://localhost:19530",
)
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 資料集中的category 欄位上建立位圖索引。add_index() 方法用來指定欄位名稱、索引類型和索引名稱。
一旦建立位圖索引,您就可以在查詢作業中使用filter 參數,根據索引欄位執行標量篩選。這可讓您使用位圖索引有效地縮窄搜尋結果的範圍。如需詳細資訊,請參閱篩選說明。
刪除索引
使用drop_index() 方法從集合中移除現有的索引。
在v2.6.3或更早版本中,您必須先釋放集合,才能刪除標量索引。
從v2.6.4或更高版本開始,一旦不再需要標量索引,您可以直接丟棄它,而不需要先釋放集合。
client.drop_index(
collection_name="my_collection", # Name of the collection
index_name="category_bitmap_index" # Name of the index to drop
)
限制
位圖索引只支援非主索引鍵的標量欄位。
欄位的資料類型必須是下列其中之一:
BOOL,INT8,INT16,INT32,INT64、VARCHARARRAY(元素必須是下列其中之一:BOOL,INT8,INT16,INT32,INT64,VARCHAR)
位圖索引不支援下列資料類型:
FLOAT,DOUBLE: 浮點類型與位圖索引的二進位性質不相容。JSON:JSON 資料類型具有複雜的結構,無法使用位圖索引有效地表示。
位圖索引不適用於高 cardinality 的欄位(即有大量不同值的欄位)。
一般而言,當欄位的 cardinality 小於 500 時,位圖索引最為有效。
當卡片性增加到超過這個臨界值時,位圖索引的效能優勢就會減弱,而且儲存開銷也會變得很大。
對於高卡片數的欄位,請考慮使用其他索引技術,例如倒轉索引,這取決於您的特定使用個案和查詢需求。