向量搜索
基于向量嵌入查询数据
本文概述了如何使用 Redis 查询引擎(Redis 开源版的一部分)执行向量搜索查询。有关 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
和参数值。 - 方言:向量搜索功能自查询方言版本二以来可用。
您可以在 FT.SEARCH 命令参考中阅读有关 PARAMS
参数的更多信息。
以下示例展示了如何基于自行车描述的嵌入以及使用字段别名 vector
查询三辆自行车。结果按距离升序返回。您可以看到查询仅返回字段 __vector_score
和 description
。字段 __vector_score
默认存在。由于模式中可以有多个向量字段,因此向量分数字段名称取决于向量字段的名称。如果将字段名称 @vector
更改为 @foo
,则分数字段名称将更改为 __foo_score
。
半径
您需要传递半径以及索引名称、向量字段名称和向量的二进制值,而不是最近邻居的数量。
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
内的描述和距离。结果按距离排序。