查询语法

向量查询通过搜索向量数据库来查找与整个集群中的查询向量最匹配的向量。本页详细介绍了此功能的运作方式。

查找相似的向量

向量搜索查询使用两种策略:

  • K 最近邻 (KNN):查找与查询向量最接近的 k 个向量。
  • 近似最近邻 (ANN):查找与查询向量近似最接近的 k 个向量

如需使用 KNN,应使用 FLAT 向量索引类型创建索引。使用 KNN 时,搜索查询将是精确的,但速度会较慢。如需使用 ANN,应使用 HNSW 向量索引类型创建索引。使用 ANN 时,搜索查询结果是近似的,但速度会更快。通过调整 HNSW 索引参数和查询中的 EF_RUNTIME 参数,可以提高 ANN 准确性。

查询语法细分

FT.SEARCH index "(hybrid_filter_expression)=>[KNN num_neighbours @my_vector_hash_key $my_vector_query_param]" PARAMS 2 my_vector_query_param "query_embedding" DIALECT 2
  • index:包含向量字段的索引的名称。

  • (hybrid_filter_expression):这是混合过滤表达式。过滤表达式中仅支持标记和数字索引。如需详细了解过滤表达式,请参阅混合查询

    • (*) 可用于执行不需要过滤的查询。
  • =>:将过滤条件与向量搜索表达式分开。

  • [KNN num_neighbours @field $vector]:KNN 搜索表达式。将 num_neighbors 替换为所选的结果数量,并将 @field 替换为矢量字段的名称。

  • PARAMS 2 my_vector_query_param "query_embedding"

    • PARAMS 后的值 2 表示必须提供两个额外的实参。
    • my_vector_query_param 是 KNN 搜索表达式中指定的查询参数向量名称。
    • query_embedding 替换为您的嵌入式查询向量。
  • DIALECT 2:指定您使用的是查询方言版本 2 或更高版本(向量搜索必需)。

混合查询

括号 () 内的初始表达式是过滤条件表达式。借助过滤表达式,您可以在执行向量搜索表达式期间过滤向量。利用过滤条件表达式来过滤结果的查询称为混合查询。标签和数字索引的任意组合都可以构成混合查询。

Memorystore for Redis Cluster 使用两种方法来过滤向量搜索表达式:

  1. 预过滤:预过滤依赖于二级索引(例如,标记、数值),首先找到与过滤表达式匹配的结果,而不考虑向量相似度。计算出过滤后的结果后,系统会执行暴力搜索,按向量相似度进行排序。
  2. 内嵌过滤:内嵌过滤会执行向量搜索算法(例如 HNSW),忽略与过滤条件不匹配的已找到向量。

当过滤后的搜索空间远小于原始搜索空间时,预过滤速度更快。当过滤后的搜索空间较大时,内嵌过滤速度会更快。Memorystore for Redis Cluster 会根据提供的过滤条件自动选择这两种策略之一。

过滤表达式同时支持标记和数字索引。

标记索引

标记是文本字段,会被解读为以分隔符分隔的标记列表。一般来说,标记是一组可能值有限的小型值集,例如颜色、图书类型、城市名称或作者。

  • 只有已编入索引的字段才能用作标记过滤条件。
  • TAG 字段通过分隔符字符进行词法单元化,默认情况下分隔符为逗号“,”,但可以在创建索引期间进行配置。
  • 在为标记字段编制索引时,系统不会执行词干提取。
  • 只能对标记字段执行前缀预过滤和精确预过滤。不支持后缀查询和中缀查询。
  • 默认情况下,标记不区分大小写。例如,“Blue”和“BLUE”都会被编入“blue”的索引,并在混合查询中产生相同的结果。
  • 空字符串既不会编入索引,也不会用于查询。
  • 在编入索引和查询期间,系统会移除所有尾随空格。
语法

其中,{} 是语法的一部分,| 用作 OR 运算符以支持多个标记:

@:{  |  | ...}

例如,以下查询将返回颜色为蓝色、黑色或绿色的文档。

@color:{blue | black | green}

再举一个例子,以下查询将返回包含“hello world”或“hello universe”的文档

@color:{hello world | hello universe}

数字索引

借助数字索引,您可以过滤查询,以仅返回介于指定起始值和结束值之间的值。

  • 支持包含性查询和排除性查询。
  • 对于开放式查询,可以使用 +inf 和 -inf 来表示开始范围和结束范围。

例如,以下查询将返回 2021 年至 2024 年(含)之间出版的图书。等效的数学表达式为 2021 <= year <= 2024

"@year:[2021 2024]"

以下查询将返回 2021 年(不含)至 2024 年(含)之间出版的图书。等效的数学表达式为 2021 < year <= 2024

@year:[(2021 2024]

以下查询将返回 2024 年(含)之前出版的图书。等效的数学表达式为 year <= 2024

@year:[(-inf 2024]

以下查询将返回 2015 年之后(不含 2015 年)出版的图书。等效的数学表达式为 year >= 2015

@year:[2015 +inf]

下表可帮助您将数学表达式映射到预过滤查询:

数学表达式 过滤条件表达式
min <= field <= max @field:[min max]
min < field <= max @field:[(min max]
min <= field < max @field:[min (max]
min < field < max @field:[(min (max]
field => min @field:[min +inf]
字段 > min @field:[(min +inf]
字段 <= 最大值 @field:[-inf max]
field < max @field:[-inf (max]
field == val @field:[val val]

逻辑运算符

您可以使用多个标记和数字字段,并结合逻辑运算符来构建复杂的查询。

逻辑与

如需设置逻辑 AND,请在谓词之间使用空格。例如:

query1 query2 query3
逻辑或

如需设置逻辑 OR,请在谓词之间使用“|”字符。例如:

query1 | query2 | query3
逻辑否定

您可以在每个查询前面添加 - 来否定相应查询。否定查询会返回与查询不匹配的所有条目。这还包括不含相应字段的文档。

例如,对 @genre:{comedy} 进行否定查询将返回所有非喜剧类图书以及所有没有流派字段的图书。

以下查询将返回所有类型为“喜剧”且未在 2015 年至 2024 年之间出版或没有年份字段的图书:

@genre:[comedy] -@year:[2015 2024]
组合使用逻辑运算符的示例

您可以组合使用逻辑运算符来形成复杂的过滤条件表达式。

以下查询将返回所有类型为“喜剧”或“恐怖”(AND)且出版时间介于 2015 年和 2024 年之间的图书:

@genre:[comedy|horror] @year:[2015 2024]

以下查询将返回所有类型为“喜剧”或“恐怖”(OR)且出版年份介于 2015 年和 2024 年之间的图书:

@genre:[comedy|horror] | @year:[2015 2024]

以下查询将返回 2015 年至 2024 年间出版的所有图书,这些图书要么没有“genre”字段,要么“genre”字段不等于“comedy”:

-@genre:[comedy] @year:[2015 2024]

如需了解使用情况,请参阅 FT.SEARCH 信息。