位圖索引
位圖索引是一種有效率的索引技術,設計用來改善低卡片性標量欄位的查詢效能。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
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
參數,根據索引欄位執行標量篩選。這可讓您使用位圖索引有效地縮窄搜尋結果的範圍。如需詳細資訊,請參閱元資料篩選。
限制
位圖索引只支援非主鍵的標量欄位。
欄位的資料類型必須是下列其中之一。
BOOL
,INT8
,INT16
,INT32
,INT64
,VARCHAR
ARRAY
(元素必須是下列其中之一: , , , , , )BOOL
INT8
INT16
INT32
INT64
VARCHAR
位圖索引不支援下列資料類型。
FLOAT
,DOUBLE
: 浮點類型與位圖索引的二進位性質不相容。JSON
:JSON 資料類型具有複雜的結構,無法使用位圖索引有效地表示。
位圖索引不適用於高 cardinality 的欄位(即有大量不同值的欄位)。
一般而言,當欄位的 cardinality 小於 500 時,位圖索引最為有效。
當卡片性增加到超過這個臨界值時,位圖索引的效能優勢就會減弱,而且儲存開銷也會變得很大。
對於高卡片數的欄位,請考慮使用其他索引技術,例如倒轉索引,這取決於您的特定使用個案和查詢需求。