向量搜索
基于向量嵌入查询数据
本文为您提供了如何使用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
以下是此查询的更详细解释:
- 预过滤器:圆括号内的第一个表达式是一个过滤器。它允许你在执行向量搜索之前决定哪些向量应该被考虑。表达式
(*)
表示所有向量都被考虑。 - 下一步:
=>
箭头表示预过滤发生在向量搜索之前。 - KNN查询: 表达式
[KNN num_neighbours @field $vector]
是一个参数化查询表达式。参数名称在查询字符串中以$
前缀表示。 - 向量二进制数据: 你需要使用
PARAMS
参数来将$vector
替换为向量的二进制表示。值2
表示PARAMS
后面跟着两个参数,参数名称vector
和参数值。 - Dialect: 向量搜索功能自查询方言的第二个版本起已可用。
你可以在FT.SEARCH命令参考中阅读更多关于PARAMS
参数的信息。
以下示例展示了如何基于描述嵌入并使用字段别名vector
查询三辆自行车。结果根据距离按升序返回。您可以看到查询仅返回字段__vector_score
和description
。字段__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
以下是此查询的更详细解释:
- 范围查询: 半径查询的语法与常规范围查询非常相似,除了关键字
VECTOR_RANGE
。你也可以像常规范围查询一样,将向量半径查询与其他查询结合使用。更多详情请参见组合查询文章。 - 额外步骤:
=>
箭头表示范围查询之后会评估额外的参数。 - 范围查询参数:可以在向量参考文档中找到诸如
$YIELD_DISTANCE_AS
等参数。 - 向量二进制数据: 你需要使用
PARAMS
来传递向量的二进制表示。 - 方言: 向量搜索自查询方言的第二版起已可用。
下面的示例显示了一个半径查询,返回描述和半径0.5
内的距离。结果按距离排序。