向量查询通过搜索向量数据库来查找与您的查询向量最匹配的向量。本页详细介绍了其工作原理。
查找相似向量
向量搜索查询使用两种策略:
- 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 使用两种方法来过滤向量搜索:
- 预过滤:预过滤依赖于二级索引(例如标记、数字),首先查找与过滤表达式匹配的内容,而不考虑向量相似度。计算出过滤后的结果后,系统会执行暴力破解搜索,按向量相似度进行排序。
- 内嵌过滤:内嵌过滤执行向量搜索算法(例如 HNSW),忽略找到的不与过滤条件匹配的向量。
当过滤后的搜索空间远小于原始搜索空间时,预过滤速度更快。当过滤后的搜索空间较大时,内嵌过滤速度更快。Memorystore for Redis 会根据提供的过滤条件自动选择这两种策略。
过滤条件表达式同时支持标记索引和数字索引。
标记索引
标记是文本字段,会被解读为以分隔符分隔的标记列表。一般来说,标记是具有有限可能值的小型值集,例如颜色、图书类型、城市名称或作者。
- 只有已编入索引的字段才能用作标记过滤条件。
- 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 年(不含)之后出版的图书。等效的数学表达式为 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] |
| field > min | @field:[(min +inf] |
| field <= max | @field:[-inf max] |
| field < max | @field:[-inf (max] |
| field == val | @field:[val val] |
逻辑运算符
您可以使用多个标记和数字字段,利用逻辑运算符构建复杂的查询。
逻辑与
如需设置逻辑与,请在谓词之间使用空格。例如:
query1 query2 query3
逻辑或
如需设置逻辑或,请在谓词之间使用“|”字符。例如:
query1 | query2 | query3
逻辑否定
您可以在每个查询前添加 - 来否定任何查询。否定查询会返回与查询不匹配的所有条目。这还包括没有该字段的文档。
例如,对 @genre:{comedy} 执行否定查询将返回所有非喜剧图书,以及所有没有类型字段的图书。
以下查询将返回所有类型为“喜剧”且未在 2015 年至 2024 年之间出版的图书,或者没有年份字段的图书:
@genre:[comedy] -@year:[2015 2024]
组合逻辑运算符的示例
您可以组合逻辑运算符以形成复杂的过滤条件表达式。
以下查询将返回所有类型为“喜剧”或“恐怖”(且)在 2015 年至 2024 年之间出版的图书:
@genre:[comedy|horror] @year:[2015 2024]
以下查询将返回所有类型为“喜剧”或“恐怖”(或)在 2015 年至 2024 年之间出版的图书:
@genre:[comedy|horror] | @year:[2015 2024]
以下查询将返回所有没有类型字段或类型字段不等于“喜剧”且在 2015 年至 2024 年之间出版的图书:
-@genre:[comedy] @year:[2015 2024]
如需了解使用方法,请参阅 FT.SEARCH 信息。