

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

# 向量搜尋命令
<a name="vector-search-commands"></a>

以下是向量搜尋支援的命令清單。

**Topics**
+ [FT.CREATE](vector-search-commands-ft.create.md)
+ [FT.SEARCH](vector-search-commands-ft.search.md)
+ [FT.AGGREGATE](vector-search-commands-ft.aggregate.md)
+ [FT.DROPINDEX](vector-search-commands-ft.dropindex.md)
+ [FT.INFO](vector-search-commands-ft.info.md)
+ [FT.\$1LIST](vector-search-commands-ft.list.md)
+ [FT.ALIASADD](vector-search-commands-ft.aliasadd.md)
+ [FT.ALIASDEL](vector-search-commands-ft.aliasdel.md)
+ [FT.ALIASUPDATE](vector-search-commands-ft.aliasupdate.md)
+ [FT.\$1ALIASLIST](vector-search-commands-ft.aliaslist.md)
+ [FT.PROFILE](vector-search-commands-ft.profile.md)
+ [FT.EXPLAIN](vector-search-commands-ft.explain.md)
+ [FT.EXPLAINCLI](vector-search-commands-ft.explain-cli.md)

# FT.CREATE
<a name="vector-search-commands-ft.create"></a>

 建立索引並啟動該索引的回填。如需詳細資訊，請參閱[向量搜尋概觀](https://docs.aws.amazon.com/memorydb/latest/devguide/vector-search-overview.html)以取得索引建構的詳細資訊。

**語法**

```
FT.CREATE <index-name>
ON HASH | JSON
[PREFIX <count> <prefix1> [<prefix2>...]]
SCHEMA 
(<field-identifier> [AS <alias>] 
  NUMERIC 
| TAG [SEPARATOR <sep>] [CASESENSITIVE] 
| TEXT
| VECTOR [HNSW|FLAT] <attr_count> [<attribute_name> <attribute_value>])

)+
```

**結構描述**
+ 欄位識別符：
  + 對於雜湊索引鍵，欄位識別符是欄位名稱。
  + 對於 JSON 金鑰，欄位識別符是 JSON 路徑。

  如需詳細資訊，請參閱[索引欄位類型](vector-search-overview.md#vector-search-index-field-types)。
+ 欄位類型：
  + TAG：如需詳細資訊，請參閱[標籤](https://redis.io/docs/interact/search-and-query/advanced-concepts/tags/) 。
  + NUMERIC：欄位包含數字。
  + 文字：欄位包含任何資料 Blob。
  + VECTOR：支援向量搜尋的向量欄位。
    + 演算法 – 可以是 HNSW (Hierarchical Navigable Small World) 或 FLAT （暴力破解）。
    + `attr_count` – 作為演算法組態傳遞的屬性數量，這包括名稱和值。
    + `{attribute_name} {attribute_value}` – 定義索引組態的演算法特定金鑰/值對。

      對於 FLAT 演算法，屬性為：

      必要：
      + DIM – 向量中的維度數量。
      + DISTANCE\$1METRIC – 可以是 【L2 \$1 IP \$1 COSINE】 之一。
      + TYPE – 向量類型。唯一支援的類型是 `FLOAT32`。

      選用：
      + INITIAL\$1CAP – 索引中的初始向量容量會影響索引的記憶體配置大小。

      對於 HNSW 演算法，屬性為：

      必要：
      + TYPE – 向量類型。唯一支援的類型是 `FLOAT32`。
      + DIM – 向量維度，指定為正整數。上限：32768
      + DISTANCE\$1METRIC – 可以是 【L2 \$1 IP \$1 COSINE】 之一。

      選用：
      + INITIAL\$1CAP – 索引中的初始向量容量會影響索引的記憶體配置大小。預設為 1024。
      + M – 每個圖層中每個節點允許的最大傳出邊緣數量。在圖零上，傳出邊緣的最大數量將為 2M。預設為 16，上限為 512。
      + EF\$1CONSTRUCTION – 控制在索引建構期間檢查的向量數量。此參數的較高值將提高召回率，同時犧牲較長的索引建立時間。預設值為 200。最大值為 4096。
      + EF\$1RUNTIME – 控制查詢操作期間檢查的向量數量。此參數的較高值可能會提高召回率，而犧牲較長的查詢時間。每個查詢都可以覆寫此參數的值。預設值為 10。最大值為 4096。

**傳回**

傳回簡單的字串 OK 訊息或錯誤回覆。

**範例**

**注意**  
下列範例使用 [valkey-cli](https://valkey.io/topics/cli/) 原生的引數，例如資料取消引號和消除逸出，再將其傳送至 Valkey 或 Redis OSS。若要使用其他程式設計語言用戶端 (Python、Ruby、C\$1 等），請遵循這些環境的處理規則來處理字串和二進位資料。如需支援用戶端的詳細資訊，請參閱 [建置工具 AWS](https://aws.amazon.com/developer/tools/)

**Example 1：建立一些索引**  
為大小為 2 的向量建立索引  

```
FT.CREATE hash_idx1 ON HASH PREFIX 1 hash: SCHEMA vec AS VEC VECTOR HNSW 6 DIM 2 TYPE FLOAT32 DISTANCE_METRIC L2
OK
```
使用 HNSW 演算法建立 6 維 JSON 索引：  

```
FT.CREATE json_idx1 ON JSON PREFIX 1 json: SCHEMA $.vec AS VEC VECTOR HNSW 6 DIM 6 TYPE FLOAT32 DISTANCE_METRIC L2
OK
```

**Example 範例 2：填入一些資料**  
下列命令已格式化，因此可以做為 redis-cli 終端機程式的引數來執行。使用程式設計語言用戶端 （例如 Python、Ruby、C\$1 等） 的開發人員需要遵循其環境的處理規則來處理字串和二進位資料。  
建立一些雜湊和 json 資料：  

```
HSET hash:0 vec "\x00\x00\x00\x00\x00\x00\x00\x00"
HSET hash:1 vec "\x00\x00\x00\x00\x00\x00\x80\xbf"
JSON.SET json:0 . '{"vec":[1,2,3,4,5,6]}'
JSON.SET json:1 . '{"vec":[10,20,30,40,50,60]}'
JSON.SET json:2 . '{"vec":[1.1,1.2,1.3,1.4,1.5,1.6]}'
```
注意下列事項：  
+ 雜湊和 JSON 資料的索引鍵具有其索引定義的字首。
+ 向量位於索引定義的適當路徑。
+ 雜湊向量會輸入為十六進位資料，而 JSON 資料則會輸入為數字。
+ 向量是適當的長度，二維雜湊向量項目有兩個值為十六進位資料的浮點數，六維 json 向量項目有六個數字。

**Example 範例 3：刪除並重新建立索引**  

```
FT.DROPINDEX json_idx1
OK

FT.CREATE json_idx1 ON JSON PREFIX 1 json: SCHEMA $.vec AS VEC VECTOR FLAT 6 DIM 6 TYPE FLOAT32 DISTANCE_METRIC L2
OK
```
請注意，新的 JSON 索引使用`FLAT`演算法而非`HNSW`演算法。另請注意，它會為現有的 JSON 資料重新編製索引：  

```
FT.SEARCH json_idx1 "*=>[KNN 100 @VEC $query_vec]" PARAMS 2 query_vec "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" DIALECT 2
1) (integer) 3
2) "json:2"
3) 1) "__VEC_score"
   2) "11.11"
   3) "$"
   4) "[{\"vec\":[1.1, 1.2, 1.3, 1.4, 1.5, 1.6]}]"
4) "json:0"
5) 1) "__VEC_score"
   2) "91"
   3) "$"
   4) "[{\"vec\":[1.0, 2.0, 3.0, 4.0, 5.0, 6.0]}]"
6) "json:1"
7) 1) "__VEC_score"
   2) "9100"
   3) "$"
   4) "[{\"vec\":[10.0, 20.0, 30.0, 40.0, 50.0, 60.0]}]"
```

# FT.SEARCH
<a name="vector-search-commands-ft.search"></a>

使用提供的查詢表達式來尋找索引內的索引鍵。一旦找到，就可以傳回這些索引鍵內索引欄位的計數和/或內容。如需詳細資訊，請參閱[向量搜尋查詢表達](https://docs.aws.amazon.com/memorydb/latest/devguide/vector-search-overview.html#vector-search-query-expression)式。

若要建立資料以用於這些範例，請參閱 [FT.CREATE ](https://docs.aws.amazon.com/memorydb/latest/devguide/vector-search-commands-ft.create.html)命令。

**語法**

```
FT.SEARCH <index-name> <query>
[RETURN <token_count> (<field-identifier> [AS <alias>])+]
[TIMEOUT timeout] 
[PARAMS <count> <name> <value> [<name> <value>]]
[LIMIT <offset> <count>]
[COUNT]
```
+ RETURN：此子句可識別傳回的金鑰欄位。每個欄位上的選用 AS 子句會覆寫結果中的欄位名稱。只能指定已為此索引宣告的欄位。
+ LIMIT：<offset> <count>：此子句提供分頁功能，其中只會傳回滿足位移和計數值的索引鍵。如果省略此子句，則預設為「LIMIT 0 10」，即最多只會傳回 10 個金鑰。
+ PARAMS：金鑰值對數量的兩倍。可以在查詢表達式中參考參數鍵/值對。如需詳細資訊，請參閱[向量搜尋查詢表達](https://docs.aws.amazon.com/memorydb/latest/devguide/vector-search-overview.html#vector-search-query-expression)式。
+ COUNT：此子句禁止傳回索引鍵的內容，只會傳回索引鍵的數量。這是「LIMIT 0 0」的別名。

**傳回**

傳回陣列或錯誤回覆。
+ 如果操作成功完成，則會傳回 陣列。第一個元素是符合查詢的金鑰總數。其餘元素是金鑰名稱和欄位清單的配對。欄位清單是包含欄位名稱和值對的另一個陣列。
+ 如果索引正在進行回填，命令會立即傳回錯誤回覆。
+ 如果達到逾時，命令會傳回錯誤回覆。

**範例：執行一些搜尋**

**注意**  
下列範例使用 [valkey-cli](https://valkey.io/topics/cli/) 原生的引數，例如將資料取消引用和取消逸出，再將其傳送至 Valkey 或 Redis OSS。若要使用其他程式設計語言用戶端 (Python、Ruby、C\$1 等），請遵循這些環境的處理規則來處理字串和二進位資料。如需支援用戶端的詳細資訊，請參閱 [上的建置工具 AWS](https://aws.amazon.com/developer/tools/)

**雜湊搜尋**

```
FT.SEARCH hash_idx1 "*=>[KNN 2 @VEC $query_vec]" PARAMS 2 query_vec "\x00\x00\x00\x00\x00\x00\x00\x00" DIALECT 2
1) (integer) 2
2) "hash:0"
3) 1) "__VEC_score"
   2) "0"
   3) "vec"
   4) "\x00\x00\x00\x00\x00\x00\x00\x00"
4) "hash:1"
5) 1) "__VEC_score"
   2) "1"
   3) "vec"
   4) "\x00\x00\x00\x00\x00\x00\x80\xbf"
```

這會產生兩個結果，依其分數排序，這是與查詢向量的距離 （輸入為十六進位）。

**JSON 搜尋**

```
FT.SEARCH json_idx1 "*=>[KNN 2 @VEC $query_vec]" PARAMS 2 query_vec "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" DIALECT 2
1) (integer) 2
2) "json:2"
3) 1) "__VEC_score"
   2) "11.11"
   3) "$"
   4) "[{\"vec\":[1.1, 1.2, 1.3, 1.4, 1.5, 1.6]}]"
4) "json:0"
5) 1) "__VEC_score"
   2) "91"
   3) "$"
   4) "[{\"vec\":[1.0, 2.0, 3.0, 4.0, 5.0, 6.0]}]"
```

這會產生兩個最接近的結果，依其分數排序，並請注意，JSON 向量值會轉換為浮點數，而查詢向量仍然是向量資料。另請注意，由於 `KNN` 參數為 2，因此只有兩個結果。較大的值將傳回更多結果：

```
FT.SEARCH json_idx1 "*=>[KNN 100 @VEC $query_vec]" PARAMS 2 query_vec "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" DIALECT 2
1) (integer) 3
2) "json:2"
3) 1) "__VEC_score"
   2) "11.11"
   3) "$"
   4) "[{\"vec\":[1.1, 1.2, 1.3, 1.4, 1.5, 1.6]}]"
4) "json:0"
5) 1) "__VEC_score"
   2) "91"
   3) "$"
   4) "[{\"vec\":[1.0, 2.0, 3.0, 4.0, 5.0, 6.0]}]"
6) "json:1"
7) 1) "__VEC_score"
   2) "9100"
   3) "$"
   4) "[{\"vec\":[10.0, 20.0, 30.0, 40.0, 50.0, 60.0]}]"
```

# FT.AGGREGATE
<a name="vector-search-commands-ft.aggregate"></a>

FT.SEARCH 命令的超集，允許對查詢表達式選取的索引鍵進行大量額外處理。

**語法**

```
FT.AGGREGATE index query
  [LOAD * | [count field [field ...]]]
  [TIMEOUT timeout]
  [PARAMS count name value [name value ...]]
  [FILTER expression]
  [LIMIT offset num]  
  [GROUPBY count property [property ...] [REDUCE function count arg [arg ...] [AS name] [REDUCE function count arg [arg ...] [AS name] ...]] ...]] 
  [SORTBY count [ property ASC | DESC [property ASC | DESC ...]] [MAX num]] 
  [APPLY expression AS name]
```
+ FILTER、LIMIT、GROUPBY、SORTBY 和 Apply 子句可以任意順序重複多次，並自由混合。它們會按照指定的順序套用，其中有一個子句的輸出饋送下一個子句的輸入。
+ 在上述語法中，「屬性」是在此索引的 [FT.CREATE](https://docs.aws.amazon.com/memorydb/latest/devguide/vector-search-commands-ft.create.html) 命令中宣告的欄位，或先前套用子句或 REDUCE 函數的輸出。
+ LOAD 子句僅限於載入已在索引中宣告的欄位。「LOAD \$1」將載入索引中宣告的所有欄位。
+ 支援下列減少程式函數：COUNT、COUNT\$1DISTINCTISH、SUM、MIN、MAX、AVG、STDDEV、QUANTILE、TOLIST、FIRST\$1VALUE 和 RANDOM\$1SAMPLE。如需詳細資訊，請參閱[彙總](https://redis.io/docs/interact/search-and-query/search/aggregations/)
+ LIMIT <offset> <count>：保留從 <offset> 開始並繼續最多 <count> 的記錄，會捨棄所有其他記錄。
+ PARAMS：金鑰值對數量的兩倍。可以在查詢表達式中參考參數鍵/值對。

**傳回**

傳回陣列或錯誤回覆。
+ 如果操作成功完成，則會傳回 陣列。第一個元素是沒有特定意義的整數 （應予以忽略）。其餘元素是最後一個階段的結果輸出。每個元素都是欄位名稱和值對的陣列。
+ 如果索引正在進行回填，命令會立即傳回錯誤回覆。
+ 如果達到逾時，命令會傳回錯誤回覆。

# FT.DROPINDEX
<a name="vector-search-commands-ft.dropindex"></a>

捨棄索引。索引定義和相關聯的內容會遭到刪除。金鑰不受影響。

**語法**

```
FT.DROPINDEX <index-name>
```

**傳回**

傳回簡單的字串 OK 訊息或錯誤回覆。

# FT.INFO
<a name="vector-search-commands-ft.info"></a>

**語法**

```
FT.INFO <index-name>
```

FT.INFO 頁面的輸出是索引鍵值對的陣列，如下表所述：


| 金錀 | 值類型 | Description | 
| --- | --- | --- | 
| index\$1name | string | 索引的名稱 | 
| creation\$1timestamp | integer | 建立時間的 Unix 樣式時間戳記 | 
| key\$1type | string | HASH 或 JSON | 
| key\$1prefixes | 字串陣列 | 此索引的金鑰字首 | 
| fields | 欄位資訊的陣列 | 此索引的欄位 | 
| space\$1usage | integer | 此索引使用的記憶體位元組 | 
| fullext\$1space\$1usage | integer | 非向量欄位使用的記憶體位元組 | 
| vector\$1space\$1usage | integer | 向量欄位使用的記憶體位元組 | 
| num\$1docs | integer | 索引中目前包含的索引鍵數量 | 
| num\$1indexed\$1vectors | integer | 索引中目前包含的向量數量 | 
| current\$1lag | integer | 最近擷取延遲 (milliSeconds) | 
| backfill\$1status | string | 其中之一：已完成、InProgres、已暫停或失敗  | 

下表說明每個欄位的資訊：


| 金錀 | 值類型 | Description | 
| --- | --- | --- | 
| identifier | string | 欄位的名稱 | 
| field\$1name | string | 雜湊成員名稱或 JSON 路徑 | 
| type | string | 其中之一：數值、標籤、文字或向量 | 
| option | string | ignore | 

如果 欄位類型為 Vector，則會根據演算法顯示其他資訊。

對於 HNSW 演算法：


| 金錀 | 值類型 | Description | 
| --- | --- | --- | 
| 演算法 | string | HNSW | 
| data\$1type | string | FLOAT32 | 
| distance\$1metric | string | 其中之一：L2、IP 或 Cosine | 
| initial\$1capacity | integer | 向量欄位索引的初始大小 | 
| current\$1capacity | integer | 向量欄位索引的目前大小 | 
| maximum\$1edges | integer | 建立時的 M 參數 | 
| ef\$1construction | integer | 建立時的 EF\$1CONSTRUCTION 參數 | 
| ef\$1runtime | integer | 建立時的 EF\$1RUNTIME 參數 | 

對於 FLAT 演算法：


| 金錀 | 值類型 | Description | 
| --- | --- | --- | 
| 演算法 | string | FLAT | 
| data\$1type | string | FLOAT32 | 
| distance\$1metric | string | 其中之一：L2、IP 或 Cosine | 
| initial\$1capacity | integer | 向量欄位索引的初始大小 | 
| current\$1capacity | integer | 向量欄位索引的目前大小 | 

# FT.\$1LIST
<a name="vector-search-commands-ft.list"></a>

列出所有索引。

**語法**

```
FT._LIST 
```

**傳回**

傳回索引名稱的陣列

# FT.ALIASADD
<a name="vector-search-commands-ft.aliasadd"></a>

新增索引的別名。新的別名名稱可在需要索引名稱的任何位置使用。

**語法**

```
FT.ALIASADD <alias> <index-name> 
```

**傳回**

傳回簡單的字串 OK 訊息或錯誤回覆。

# FT.ALIASDEL
<a name="vector-search-commands-ft.aliasdel"></a>

刪除索引的現有別名。

**語法**

```
FT.ALIASDEL <alias>
```

**傳回**

傳回簡單的字串 OK 訊息或錯誤回覆。

# FT.ALIASUPDATE
<a name="vector-search-commands-ft.aliasupdate"></a>

更新現有的別名以指向不同的實體索引。此命令只會影響未來對別名的參考。目前進行中的操作 (FT.SEARCH、FT.AGGREGATE) 不受此命令影響。

**語法**

```
FT.ALIASUPDATE <alias> <index>
```

**傳回**

傳回簡單的字串 OK 訊息或錯誤回覆。

# FT.\$1ALIASLIST
<a name="vector-search-commands-ft.aliaslist"></a>

列出索引別名。

**語法**

```
FT._ALIASLIST
```

**傳回**

傳回目前別名數量大小的陣列。陣列的每個元素都是別名索引對。

# FT.PROFILE
<a name="vector-search-commands-ft.profile"></a>

執行查詢並傳回有關該查詢的設定檔資訊。

**語法**

```
FT.PROFILE 

<index>
SEARCH | AGGREGATE 
[LIMITED]
QUERY <query ....>
```

**傳回**

雙元素陣列。第一個元素是分析的 `FT.SEARCH`或 `FT.AGGREGATE`命令的結果。第二個元素是效能和分析資訊的陣列。

# FT.EXPLAIN
<a name="vector-search-commands-ft.explain"></a>

剖析查詢並傳回如何剖析該查詢的資訊。

**語法**

```
FT.EXPLAIN <index> <query>
```

**傳回**

包含剖析結果的字串。

# FT.EXPLAINCLI
<a name="vector-search-commands-ft.explain-cli"></a>

與 FT.EXPLAIN 命令相同，但結果會以對 redis-cli 更有用的不同格式顯示。

**語法**

```
FT.EXPLAINCLI <index> <query>
```

**傳回**

包含剖析結果的字串。