標量索引
Milvus 支援結合標量值與向量值欄位的篩選搜尋。為了提高涉及標量字段的搜尋效率,Milvus 從版本 2.1.0 開始引入標量字段索引。這篇文章概述 Milvus 的標量欄位索引,幫助您了解其意義和實作。
概述
在 Milvus 中執行向量相似性搜尋時,您可以使用邏輯運算符號將標量欄位組織成布林表達式。
當 Milvus 接收到具有這種布林表達式的搜尋請求,它會將布林表達式解析為抽象語法樹 (AST),以產生屬性篩選的實體計劃。Milvus 接著會在每個區段套用實體規劃,產生一個bitset作為篩選結果,並將結果包含在向量搜尋參數中,以縮窄搜尋範圍。在這種情況下,向量搜尋的速度在很大程度上依賴於屬性篩選的速度。
分段中的屬性篩選
標量欄位索引是一種確保屬性過濾速度的方法,它以特定的方式將標量欄位值排序,以加快資訊檢索的速度。
標量欄位索引演算法
Milvus 的標量欄位索引演算法旨在達到低記憶體使用率、高篩選效率和短載入時間的目標。這些演算法主要分為兩大類:自動索引和反向索引。
自動索引
Milvus 提供AUTOINDEX
選項,讓您不必手動選擇索引類型。在呼叫create_index
方法時,如果沒有指定index_type
,Milvus 會根據資料類型自動選擇最適合的索引類型。
下表列出了 Milvus 支援的資料類型及其對應的自動索引演算法。
資料類型 | 自動索引演算法 |
---|---|
VARCHAR | 反向索引 |
INT8 | 反向索引 |
INT16 | 反向索引 |
INT32 | 反轉索引 |
INT64 | 反轉索引 |
FLOAT | 反轉索引 |
DOUBLE | 反轉索引 |
反向索引
反向索引提供了一種靈活的方式,可透過手動指定索引參數為標量欄位建立索引。這種方法適用於各種情況,包括點查詢、模式匹配查詢、全文檢索、JSON 檢索、布林檢索,甚至前綴匹配查詢。
Milvus 中實作的倒置索引是由Tantivy(一個全文本搜尋引擎函式庫)所支援。Tantivy 可確保 Milvus 中的倒排索引既高效又快速。
倒排索引有兩個主要組成部分:詞彙字典和倒排清單。詞彙字典包含所有按字母順序排序的標記化詞彙,而倒序清單包含每個詞彙出現的文件清單。這種設定使點查詢和範圍查詢比暴力搜尋更快、更有效率。
倒置索引圖
使用倒置索引的優點在下列作業中特別明顯:
- 點查詢:例如,在搜尋包含Milvus 這個詞的文件時,首先會檢查Milvus是否出現在詞彙字典中。如果沒有找到,就表示沒有文件包含這個詞。但是,如果找到了,則會擷取與Milvus相關的反向清單,指出包含該詞的文件。這個方法遠比在一百萬個文件中強行搜尋有效率,因為排序的詞彙字典大幅降低了尋找Milvus 這個詞的時間複雜度。
- 範圍查詢:範圍查詢的效率,例如尋找字首字母大於very 的文件,也會因為排序的詞彙字典而提升。這種方法比暴力搜尋更有效率,能提供更快速、更精準的結果。
測試結果
為了證明 Milvus 中標量索引所提供的效能改善,我們進行了一項實驗,比較在原始資料上使用倒轉索引和暴力搜尋的幾種表達方式的效能。
該實驗涉及在兩種條件下測試各種表達式:使用倒置索引和使用暴力搜尋。為了確保公平性,每次測試都使用相同的資料集,並維持相同的資料分佈。每次測試前,都會釋放資料集,並丟棄和重建索引。此外,每次測試前都會執行暖查詢,以盡量減少冷資料和熱資料的影響,而且每次查詢都會執行多次,以確保準確性。
對於100 萬筆記錄的資料集而言,使用反轉索引可為點查詢提供高達30 倍的效能提升。對於較大的資料集,效能提升可能更為顯著。
效能建議
為了充分利用 Milvus 在標量字段索引方面的能力,以及發揮其在向量相似性搜尋方面的威力,您可能需要一個模型來根據您的資料估計所需的記憶體大小。
以下表格列出 Milvus 支援的所有資料類型的估算功能。
數值欄位
資料類型 記憶體估算函數 (MB) INT8 numOfRows *12/ 1024 / 1024 INT16 numOfRows *12/ 1024 / 1024 INT32 行數 *12/ 1024 / 1024 INT64 numOfRows *24/ 1024 / 1024 FLOAT32 numOfRows *12/ 1024 / 1024 DOUBLE numOfRows *24/ 1024 / 1024 字串欄位
字串長度 記憶體估算功能 (MB) (0, 8] 行數 *128/ 1024 / 1024 (8, 16] 行數 *144/ 1024 / 1024 (16, 32] 行數 *160/ 1024 / 1024 (32, 64] 行數 *192/ 1024 / 1024 (64, 128] 行數 *256/ 1024 / 1024 (128, 65535] numOfRows *strLen * 1.5/ 1024 / 1024