

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 向量搜尋概觀
<a name="vector-search-overview"></a>

ElastiCache for Valkey 提供索引、搜尋和更新數十億個高維度向量內嵌的功能。向量搜尋可讓您建立、維護和使用次要索引，以實現有效率且可擴展的搜尋。每個向量搜尋操作都適用於單一索引。索引操作僅適用於指定的索引。除了索引建立和刪除操作之外，任何數量的操作都可以隨時針對任何索引發出。在叢集層級，多個索引的多個操作可能同時進行。

在此文件中，索引鍵、資料列和記錄一詞相同，可互換使用。同樣地，術語欄、欄位、路徑和成員也會互換使用。

`FT.CREATE` 命令可用來為具有指定索引類型的索引鍵子集建立索引。 會對建立的索引`FT.SEARCH`執行查詢，並`FT.DROPINDEX`移除現有的索引和所有相關資料。沒有特殊命令可新增、刪除或修改索引資料。修改索引中索引鍵的現有 `HASH`或 `JSON`命令會自動更新索引。

**Topics**
+ [索引和 Valkey OSS 金鑰空間](#indexes-keyspace)
+ [索引欄位類型](#index-field-types)
+ [向量索引演算法](#vector-index-algorithms)
+ [向量搜尋安全性](#vector-search-security)

## 索引和 Valkey OSS 金鑰空間
<a name="indexes-keyspace"></a>

在 Valkey OSS 金鑰空間的子集上建構和維護索引。每個索引的金鑰空間是由建立索引時提供的金鑰字首清單所定義。字首清單是選用的，如果省略，整個金鑰空間將是該索引的一部分。多個索引可以選擇不相交或重疊的鍵空間子集，不受限制。

索引也會輸入，只涵蓋具有相符類型的索引鍵。目前， 索引僅支援 `JSON`和 `HASH`類型。`HASH` 索引只會為其字首清單涵蓋的索引`HASH`鍵編製索引，類似地，`JSON`索引只會為其字首清單涵蓋的索引`JSON`鍵編製索引。索引的鍵空間字首清單中沒有指定類型的鍵會被忽略，不會影響搜尋操作。

當命令修改索引鍵空間內的任何索引鍵時，索引會更新。Valkey 會自動擷取每個索引的宣告欄位，並使用新值更新索引。更新程序有三個步驟。在第一個步驟中，修改 HASH 或 JSON 金鑰，並封鎖請求用戶端。第二個步驟是在背景執行，並更新包含修改後金鑰的每個索引。在第三個步驟中，用戶端會解除封鎖。因此，對於在與變動相同的連線上執行的查詢操作，該變更會立即顯示在搜尋結果中。

建立索引是一個多步驟程序。第一步是執行定義索引的 FT.CREATE 命令。成功執行建立會自動啟動第二個步驟 – 回填。回填程序會在背景執行緒中執行，並掃描金鑰空間，尋找新索引字首清單中的金鑰。找到的每個索引鍵都會新增至索引。最後掃描整個金鑰空間，完成索引建立程序。請注意，當回填程序執行時，允許索引鍵的變動、沒有限制，而且索引回填程序將無法完成，直到所有索引鍵都正確編製索引為止。不允許在索引進行回填時嘗試查詢操作，並以錯誤終止。FT.INFO 命令會在 'backfill\$1status' 欄位中傳回回填程序狀態。

## 索引欄位類型
<a name="index-field-types"></a>

每個索引都有特定類型，會在建立索引時與要編製索引的欄位 （資料欄） 位置一起宣告。對於`HASH`金鑰，位置是 中的欄位名稱`HASH`。對於`JSON`金鑰，位置是 JSON 路徑描述。修改金鑰時，會擷取與宣告欄位相關聯的資料，並轉換為宣告類型，並存放在索引中。如果資料遺失或無法成功轉換為宣告的類型，則會從索引省略該欄位。欄位有三種類型，如下所述：
+ **向量欄位**包含一個數字向量，也稱為向量內嵌。向量欄位可用來根據測量相似性的指定距離指標來篩選向量。對於`HASH`索引， 欄位應包含以二進位格式 (little-endian IEEE 754) 編碼的整個向量。對於`JSON`索引鍵，路徑應該參考填充數字的正確大小陣列。請注意，當 JSON 陣列用作向量欄位時，JSON 金鑰內陣列的內部表示會轉換為所選演算法所需的格式，從而減少記憶體消耗和精確度。使用 JSON 命令的後續讀取操作將產生降低的精確度值。
+ **數字欄位**包含單一數字。數字欄位可與範圍搜尋運算子搭配使用。對於 `HASH`， 欄位應包含以固定或浮點數標準格式寫入之數字的 ASCII 文字。對於 `JSON` 欄位，必須遵循 JSON 號碼的數值規則。無論金鑰中的表示法為何，此欄位都會轉換為 64 位元浮點數，以供索引內儲存。由於基礎數字存放在具有精確度限制的浮點中，因此適用浮點數字比較的一般規則。
+ **標籤欄位**包含以單一 UTF-8 字串編碼的零個或多個標籤值。標籤欄位可用來透過區分大小寫或區分大小寫的比較，篩選標籤值相等性的查詢。字串會使用分隔符號字元 （預設為逗號，但可以覆寫） 剖析為標籤值，並移除開頭和結尾的空格。任何數量的標籤值都可以包含在單一標籤欄位中。

## 向量索引演算法
<a name="vector-index-algorithms"></a>

Valkey 支援兩種向量索引演算法：
+ **平面** – 平面演算法是索引中每個向量的暴力力線性處理，在距離運算的精確度範圍內產生確切的答案。由於索引的線性處理，此演算法的執行時間對於大型索引可能非常高。平面索引支援更高的擷取速度。
+ **階層式導航小型世界 (HNSW)** – HNSW 演算法是一種替代方法，可提供最接近的向量比對，以換取大幅較低的執行時間。演算法由三個參數 `M`、 `EF_CONSTRUCTION`和 控制`EF_RUNTIME`。前兩個參數是在索引建立時間指定，無法變更。`EF_RUNTIME` 參數具有在建立索引時指定的預設值，但之後可以在任何個別查詢操作上覆寫。這三個參數互動，在擷取和查詢操作期間平衡記憶體和 CPU 消耗，並控制精確 KNN 搜尋的近似品質 （稱為取回率）。

在 HNSW 中， 參數 M 控制每個節點可連線的鄰數上限，從而塑造索引密度。諸如 32 及更高版本的 M 會產生更連線的圖形，從而提高召回和查詢速度，因為有更多路徑可以到達相關鄰。不過，它會增加索引大小、記憶體使用量，並減慢索引速度。較低的 M，例如 8 和以下，會產生較小、faster-to-build索引，且記憶體使用量較低，但回收減少，且由於連線較少，查詢可能需要更長的時間。

參數 EF\$1construction 決定在建置索引時要評估的候選連線數量。EF\$1construction 較高，例如 400 及更高，表示索引器在選取相鄰之前會考慮更多路徑，導致圖形在稍後同時改善召回和查詢效率，但在建構期間降低索引和更高 CPU 和記憶體使用成本。EF\$1construction 較低，例如 64-120，可加速索引並減少資源使用，但產生的圖形即使 EF\$1runtime 設定為高，也可能減少召回和慢查詢。

最後，EF\$1runtime 會在查詢期間管理搜尋的廣度，控制在執行時間探索多少候選鄰。將其設定為高可提高召回率和準確性，但代價是查詢延遲和 CPU 使用。低 EF\$1runtime 可讓查詢更快、更輕量，但召回率較低。與 M 或 EF\$1construction 不同，此參數不會影響索引大小或建置時間，使其成為在建立索引之後調整取回與延遲權衡的參數。

向量搜尋演算法 (Flat 和 HNSW) 都支援選用`INITIAL_CAP`參數。指定時，此參數會預先配置索引的記憶體，進而降低記憶體管理開銷並提高向量擷取速率。平面索引支援比 HNSW 更好的擷取速度。

像 HNSW 這樣的向量搜尋演算法可能無法有效地處理先前插入向量的刪除或覆寫。使用這些操作可能會導致索引記憶體消耗過多和/或召回品質降低。重新索引是還原最佳記憶體用量和/或召回的方法之一。

## 向量搜尋安全性
<a name="vector-search-security"></a>

命令和資料存取的 [Valkey ACL （存取控制清單）](https://valkey.io/topics/acl/) 安全機制都會擴展，以控制搜尋設施。完全支援個別搜尋命令的 ACL 控制。提供了新的 ACL 類別 `@search`，並更新了許多現有類別 (`@fast`、`@write`、 `@read`等），以包含新的命令。搜尋命令不會修改金鑰資料，這表示會保留用於寫入存取的現有 ACL 機器。索引的存在不會修改 `HASH`和 `JSON`操作的存取規則；一般金鑰層級存取控制仍會套用至這些命令。

具有 索引的搜尋命令也會透過 ACL 控制其存取。存取檢查是在整個索引層級執行，而不是在每個金鑰層級。這表示只有在該使用者具有存取該索引之金鑰空間字首清單中所有可能金鑰的許可時，才會將索引的存取權授予使用者。換句話說，索引的實際內容不會控制存取。相反地，它是 索引的理論內容，由用於安全檢查的字首清單所定義。使用者具有金鑰的讀取和/或寫入存取權，但無法存取包含該金鑰的索引的情況是可能的。請注意，建立或使用索引只需要對 金鑰空間的讀取存取權 – 不會考慮是否存在寫入存取權