向量搜索

根据向量嵌入查询数据

本文全面概述了如何使用 Redis Stack 执行向量搜索查询。有关 Redis 作为向量数据库的更多信息,请参阅 Redis 作为向量数据库快速入门指南。您还可以从 向量参考文档 中找到有关所有参数的更详细的信息。

在向量字段上执行向量搜索查询,可以找到向量空间中与给定向量相近的所有向量。您可以查询 k 个最近邻或给定半径内的向量。

本文中的示例使用以下字段的模式

JSON 字段 字段别名 字段类型 描述
$.description description TEXT 自行车的描述,为非结构化文本
$.description_embeddings vector VECTOR 机器学习模型从描述文本中推导出的向量

K 个最近邻 (KNN)

Redis 命令 FT.SEARCH 将索引名称、查询字符串和附加查询参数作为参数。您需要传递最近邻的数量、向量字段名称和向量的二进制表示,如下所示

FT.SEARCH index "(*)=>[KNN num_neighbours @field $vector]" PARAMS 2 vector "binary_data" DIALECT 2

以下是此查询的更详细解释

  1. 预过滤:圆括号内的第一个表达式是一个过滤器。它允许您在执行向量搜索之前决定哪些向量应该被考虑。表达式 (*) 表示考虑所有向量。
  2. 下一步=> 箭头表示预过滤在向量搜索之前发生。
  3. KNN 查询:表达式 [KNN num_neighbours @field $vector] 是一个参数化查询表达式。参数名称由查询字符串中的 $ 前缀指示。
  4. 向量二进制数据:您需要使用 PARAMS 参数将 $vector 替换为向量的二进制表示。值 2 表示 PARAMS 后面跟着两个参数,参数名称 vector 和参数值。
  5. 方言:向量搜索功能从查询方言的版本二开始可用。

您可以在 FT.SEARCH 命令参考中详细了解 PARAMS 参数。

以下示例显示了如何根据自行车的描述嵌入查询三辆自行车,并使用字段别名 vector。结果将根据距离按升序返回。您可以看到查询仅返回 __vector_scoredescription 字段。__vector_score 字段默认存在。因为您的模式中可能有多个向量字段,向量得分字段名称取决于向量字段的名称。如果您将字段名称 @vector 更改为 @foo,得分字段名称将更改为 __foo_score

FT.SEARCH idx:bikes_vss "(*)=>[KNN 3 @vector $query_vector]" PARAMS 2 "query_vector" "Z\xf8\x15:\xf23\xa1\xbfZ\x1dI>\r\xca9..." SORTBY "__vector_score" ASC RETURN 2 "__vector_score" "description" DIALECT 2
注意
本示例中查询向量的二进制值已大幅缩短。

半径

您需要传递半径以及索引名称、向量字段名称和向量的二进制值,而不是最近邻的数量

FT.SEARCH index "@field:[VECTOR_RANGE radius $vector]" PARAMS 2 vector "binary_data" DIALECT 2

如果您想按距离排序,那么您必须通过范围查询参数 $YIELD_DISTANCE_AS 生成距离

FT.SEARCH index "@field:[VECTOR_RANGE radius $vector]=>{$YIELD_DISTANCE_AS: dist_field}" PARAMS 2 vector "binary_data" SORTBY dist_field DIALECT 2

以下是此查询的更详细解释

  1. 范围查询:半径查询的语法与常规范围查询非常相似,除了关键字 VECTOR_RANGE。您也可以将向量半径查询与其他查询组合在一起,就像常规范围查询一样。有关详细信息,请参阅 组合查询文章
  2. 额外步骤=> 箭头表示范围查询后会评估其他参数。
  3. 范围查询参数:您可以在 向量参考文档 中找到 $YIELD_DISTANCE_AS 等参数。
  4. 向量二进制数据:您需要使用 PARAMS 传递向量的二进制表示。
  5. 方言:向量搜索功能从查询方言的版本二开始可用。
注意
默认情况下,FT.SEARCH 仅返回前十个结果。范围查询文章 向您解释如何滚动浏览结果集。

以下示例显示了一个半径查询,它返回 0.5 半径内的描述和距离。结果按距离排序。

FT.SEARCH idx:bikes_vss "@vector:[VECTOR_RANGE 0.5 $query_vector]=>{$YIELD_DISTANCE_AS: vector_dist}" PARAMS 2 "query_vector" "Z\xf8\x15:\xf23\xa1\xbfZ\x1dI>\r\xca9..." SORTBY vector_dist ASC RETURN 2 vector_dist description DIALECT 2
RATE THIS PAGE
Back to top ↑