🚀 免費嘗試 Zilliz Cloud,完全托管的 Milvus,體驗速度提升 10 倍!立即嘗試

milvus-logo
LFAI
主頁
  • 概念

標量索引

Milvus 支援結合標量值與向量值欄位的篩選搜尋。為了提高涉及標量字段的搜尋效率,Milvus 從版本 2.1.0 開始引入標量字段索引。這篇文章概述 Milvus 的標量欄位索引,幫助您了解其意義和實作。

概述

在 Milvus 中執行向量相似性搜尋時,您可以使用邏輯運算符號將標量欄位組織成布林表達式。

當 Milvus 接收到具有這種布林表達式的搜尋請求,它會將布林表達式解析為抽象語法樹 (AST),以產生屬性篩選的實體計劃。Milvus 接著會在每個區段套用實體規劃,產生一個bitset作為篩選結果,並將結果包含在向量搜尋參數中,以縮窄搜尋範圍。在這種情況下,向量搜尋的速度在很大程度上依賴於屬性篩選的速度。

Attribute filtering in a segment 分段中的屬性篩選

標量欄位索引是一種確保屬性過濾速度的方法,它以特定的方式將標量欄位值排序,以加快資訊檢索的速度。

標量欄位索引演算法

Milvus 的標量欄位索引演算法旨在達到低記憶體使用率、高篩選效率和短載入時間的目標。這些演算法主要分為兩大類:自動索引反向索引

自動索引

Milvus 提供AUTOINDEX 選項,讓您不必手動選擇索引類型。在呼叫create_index 方法時,如果沒有指定index_type ,Milvus 會根據資料類型自動選擇最適合的索引類型。

下表列出了 Milvus 支援的資料類型及其對應的自動索引演算法。

資料類型自動索引演算法
VARCHAR反向索引
INT8反向索引
INT16反向索引
INT32反轉索引
INT64反轉索引
FLOAT反轉索引
DOUBLE反轉索引

反向索引

反向索引提供了一種靈活的方式,可透過手動指定索引參數為標量欄位建立索引。這種方法適用於各種情況,包括點查詢、模式匹配查詢、全文檢索、JSON 檢索、布林檢索,甚至前綴匹配查詢。

Milvus 中實作的倒置索引是由Tantivy(一個全文本搜尋引擎函式庫)所支援。Tantivy 可確保 Milvus 中的倒排索引既高效又快速。

倒排索引有兩個主要組成部分:詞彙字典和倒排清單。詞彙字典包含所有按字母順序排序的標記化詞彙,而倒序清單包含每個詞彙出現的文件清單。這種設定使點查詢和範圍查詢比暴力搜尋更快、更有效率。

Inverted index diagram 倒置索引圖

使用倒置索引的優點在下列作業中特別明顯:

  • 點查詢:例如,在搜尋包含Milvus 這個詞的文件時,首先會檢查Milvus是否出現在詞彙字典中。如果沒有找到,就表示沒有文件包含這個詞。但是,如果找到了,則會擷取與Milvus相關的反向清單,指出包含該詞的文件。這個方法遠比在一百萬個文件中強行搜尋有效率,因為排序的詞彙字典大幅降低了尋找Milvus 這個詞的時間複雜度。
  • 範圍查詢:範圍查詢的效率,例如尋找字首字母大於very 的文件,也會因為排序的詞彙字典而提升。這種方法比暴力搜尋更有效率,能提供更快速、更精準的結果。

測試結果

為了證明 Milvus 中標量索引所提供的效能改善,我們進行了一項實驗,比較在原始資料上使用倒轉索引和暴力搜尋的幾種表達方式的效能。

該實驗涉及在兩種條件下測試各種表達式:使用倒置索引和使用暴力搜尋。為了確保公平性,每次測試都使用相同的資料集,並維持相同的資料分佈。每次測試前,都會釋放資料集,並丟棄和重建索引。此外,每次測試前都會執行暖查詢,以盡量減少冷資料和熱資料的影響,而且每次查詢都會執行多次,以確保準確性。

對於100 萬筆記錄的資料集而言,使用反轉索引可為點查詢提供高達30 倍的效能提升。對於較大的資料集,效能提升可能更為顯著。

效能建議

為了充分利用 Milvus 在標量字段索引方面的能力,以及發揮其在向量相似性搜尋方面的威力,您可能需要一個模型來根據您的資料估計所需的記憶體大小。

以下表格列出 Milvus 支援的所有資料類型的估算功能。

  • 數值欄位

    資料類型記憶體估算函數 (MB)
    INT8numOfRows *12/ 1024 / 1024
    INT16numOfRows *12/ 1024 / 1024
    INT32行數 *12/ 1024 / 1024
    INT64numOfRows *24/ 1024 / 1024
    FLOAT32numOfRows *12/ 1024 / 1024
    DOUBLEnumOfRows *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

接下來

免費嘗試托管的 Milvus

Zilliz Cloud 無縫接入,由 Milvus 提供動力,速度提升 10 倍。

開始使用
反饋

這個頁面有幫助嗎?