

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 向量搜索命令
<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：字段包含一个数字。
  + TEXT：字段包含任何数据块。
  + VECTOR：支持向量搜索的向量字段。
    + 算法 – 可以是 HNSW（分层可导航小世界）或 FLAT（暴力）。
    + `attr_count` – 将作为算法配置传递的属性数量，包括名称和值。
    + `{attribute_name} {attribute_value}`— 定义索引配置的特定算法 key/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。

**Return**

返回简单的字符串 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>

使用提供的查询表达式查找索引中的键。找到后，可以返回这些键中索引字段的计数 and/or 内容。有关更多信息，请参阅[向量搜索查询表达式](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：键值对数量的两倍。可以在查询表达式中引用参数 key/value 对。有关更多信息，请参阅[向量搜索查询表达式](https://docs.aws.amazon.com/memorydb/latest/devguide/vector-search-overview.html#vector-search-query-expression)。
+ COUNT：此子句不返回键的内容，只返回键的数量。这就相当于使用“LIMIT 0 0”。

**Return**

返回数组或错误响应。
+ 如果操作成功完成，则返回一个数组。第一个元素是与查询匹配的键的总数。其余元素是键名称和字段列表配对。字段列表是另一个数组，包含字段名称和对应值的配对。
+ 如果索引正在回填，该命令会立即返回错误响应。
+ 如果超时，该命令将返回错误响应。

**示例：进行一些搜索**

**注意**  
以下示例使用 [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) 命令中为此索引声明的字段，要么是之前的 APPLY 子句或 REDUCE 函数的输出。
+ LOAD 子句仅限于加载已在索引中声明的字段。“LOAD \$1”将加载索引中声明的所有字段。
+ 支持以下 reducer 函数：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：键值对数量的两倍。可以在查询表达式中引用参数 key/value 对。

**Return**

返回数组或错误响应。
+ 如果操作成功完成，则返回一个数组。第一个元素是没有特殊含义的整数（应忽略）。其余元素是最后一个阶段输出的结果。每个元素都是由字段名称和值对组成的数组。
+ 如果索引正在回填，该命令会立即返回错误响应。
+ 如果超时，该命令将返回错误响应。

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

删除一个索引。将删除索引定义和相关内容。键不受影响。

**语法**

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

**Return**

返回一条简单的字符串 OK 消息或错误响应。

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

**语法**

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

FT.INFO 页面的输出是由键值对组成的数组，如下表所述：


| 键 | 值类型 | 说明 | 
| --- | --- | --- | 
| index\$1name | 字符串 | 索引的名称 | 
| creation\$1timestamp | 整数 | 创建时间的 Unix 样式时间戳 | 
| key\$1type | 字符串 | 哈希或 JSON | 
| key\$1prefixes | 字符串数组 | 此索引的键前缀 | 
| fields | 字段信息数组 | 此索引的字段 | 
| space\$1usage | 整数 | 此索引使用的内存字节数 | 
| fullext\$1space\$1usage | 整数 | 非向量字段使用的内存字节数 | 
| vector\$1space\$1usage | 整数 | 向量字段使用的内存字节数 | 
| num\$1docs | 整数 | 当前包含在索引中的键数 | 
| num\$1indexed\$1vectors | 整数 | 当前包含在索引中的向量数 | 
| current\$1lag | 整数 | 最近的摄取延迟（毫秒） | 
| backfill\$1status | 字符串 | 其中之一：已完成 InProgres、已暂停或失败  | 

下表描述了每个字段的信息：


| Key | 值类型 | 说明 | 
| --- | --- | --- | 
| identifier | 字符串 | 字段名称 | 
| field\$1name | 字符串 | 哈希成员名称或 JSON 路径 | 
| 类型 | 字符串 | 以下类型之一：“Numeric”、“Tag”、“Text”或“Vector” | 
| option | 字符串 | 忽略 | 

如果字段的类型为 Vector，则根据算法的不同，可能会包含额外信息。

HNSW 算法：


| Key | 值类型 | 说明 | 
| --- | --- | --- | 
| algorithm | 字符串 | HNSW | 
| data\$1type | 字符串 | FLOAT32 | 
| distance\$1metric | 字符串 | 以下值之一：“L2”、“IP”或“Cosine” | 
| initial\$1capacity | 整数 | 向量字段索引的初始大小 | 
| current\$1capacity | 整数 | 向量字段索引的当前大小 | 
| maximum\$1edges | 整数 | 创建时的 M 参数 | 
| ef\$1construction | 整数 | 创建时的 EF\$1CONSTRUCTION 参数 | 
| ef\$1runtime | 整数 | 创建时的 EF\$1RUNTIME 参数 | 

FLAT 算法：


| Key | 值类型 | 说明 | 
| --- | --- | --- | 
| algorithm | 字符串 | FLAT | 
| data\$1type | 字符串 | FLOAT32 | 
| distance\$1metric | 字符串 | 以下值之一：“L2”、“IP”或“Cosine” | 
| initial\$1capacity | 整数 | 向量字段索引的初始大小 | 
| current\$1capacity | 整数 | 向量字段索引的当前大小 | 

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

列出所有索引。

**语法**

```
FT._LIST 
```

**Return**

返回索引名称数组

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

为索引添加别名。新别名可以在需要索引名称的任何位置使用。

**语法**

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

**Return**

返回一条简单的字符串 OK 消息或错误响应。

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

删除索引的现有别名。

**语法**

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

**Return**

返回一条简单的字符串 OK 消息或错误响应。

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

更新现有别名以指向不同的物理索引。该命令只影响将来对别名的引用。当前正在进行的操作（FT.SEARCH、FT.AGGREGATE）不受此命令的影响。

**语法**

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

**Return**

返回一条简单的字符串 OK 消息或错误响应。

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

列出索引别名。

**语法**

```
FT._ALIASLIST
```

**Return**

返回一个数组，其大小与当前别名的数量相同。此数组的每个元素都是别名索引对。

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

运行查询并返回有关该查询的配置文件信息。

**语法**

```
FT.PROFILE 

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

**Return**

由两个元素组成的数组。第一个元素是分析 `FT.SEARCH` 或 `FT.AGGREGATE` 命令的结果。第二个元素是由性能和分析信息组成的数组。

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

解析查询并返回有关如何解析该查询的信息。

**语法**

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

**Return**

包含解析结果的字符串。

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

与 FT.EXPLAIN 命令相同，除了结果以更适合 redis-cli 的不同格式显示。

**语法**

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

**Return**

包含解析结果的字符串。