向量搜索

基于向量嵌入查询数据

本文为您提供了如何使用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. Dialect: 向量搜索功能自查询方言的第二个版本起已可用。

你可以在FT.SEARCH命令参考中阅读更多关于PARAMS参数的信息。

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

注意:
在上面的CLI示例中,查询向量的二进制值被显著缩短了。

半径

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

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内的距离。结果按距离排序。

RATE THIS PAGE
Back to top ↑