向量搜索
基于向量嵌入的数据查询
本文为您详细介绍了如何使用 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
和参数值。 - 方言:自查询方言第二版起,矢量搜索功能就已可用。
您可以PARAMS
在FT.SEARCH命令参考中阅读有关该参数的更多信息。
以下示例向您展示了如何根据自行车的描述嵌入并使用字段别名 查询三辆自行车vector
。结果将根据距离按升序返回。您可以看到查询仅返回字段__vector_score
和description
。默认情况下存在 字段__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
以下是对此查询的更详细解释:
- 范围查询:半径查询的语法与常规范围查询非常相似,除了关键字
VECTOR_RANGE
。您还可以像常规范围查询一样将向量半径查询与其他查询组合在一起。有关更多详细信息,请参阅组合查询文章。 - 附加步骤:
=>
箭头表示范围查询后面跟着评估附加参数。 - 范围查询参数:例如可以在向量参考文档
$YIELD_DISTANCE_AS
中找到的参数。 - 向量二进制数据:您需要使用
PARAMS
来传递向量的二进制表示形式。 - 方言:自查询方言第二版以来,向量搜索已经可用。
下面的示例显示了一个半径查询,该查询返回半径内的描述和距离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