向量查询的运作方式是搜索向量数据库,以在整个集群中查找与您的查询向量最匹配的向量。本页详细介绍了 工作。
查找类似的矢量
矢量搜索查询使用两种策略:
- 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 Valkey 使用两种方法过滤矢量搜索:
- 预过滤:预过滤依赖于次级索引(例如标记、数字)来首先查找与过滤器表达式匹配的项,而不考虑向量相似度。计算出过滤结果后,系统会执行暴力搜索,按向量相似性进行排序。
- 内联过滤:内联过滤执行矢量搜索算法(如 HNSW),忽略与过滤器不匹配的已找到矢量。
如果过滤后的搜索空间比原始搜索空间小得多,则预过滤速度会更快。如果过滤后的搜索空间较大,内嵌过滤的速度会更快。Memorystore for Valkey 会根据提供的过滤条件自动在两种策略之间进行选择。
过滤表达式同时支持标记索引和数字索引。
代码索引
代码是文本字段,系统会将其解读为由分隔符字符分隔的代码列表。通常,标签是较小的值集合,具有有限的可能值,如颜色、图书类型、城市名称或作者。
- 只有已编入索引的字段可用作标记过滤条件。
- 代码字段由分隔符进行词法单元化,默认分隔符为英文逗号“,”,但可以在创建索引时进行配置。
- 在为代码字段编制索引时,系统不会进行词根提取。
- 只能对标记字段执行精确的前缀过滤。不支持后缀和 infix 查询。
- 默认情况下,代码不区分大小写。例如,“Blue”和“BLUE”都会被编入索引为“blue”,并在混合查询中产生相同的结果。
- 系统不会对空字符串编入索引,也不会对其进行查询。
- 在编制索引和查询期间,系统会移除所有尾随空格。
语法
其中 {
和 }
是语法的一部分,|
用作 OR 运算符来支持多个标记:
@:{ | | ...}
例如,以下查询将返回蓝色 OR 黑色 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]
如需将数学表达式映射到预过滤查询,请参考下表:
数学表达式 | 过滤条件表达式 |
---|---|
最小值 <= 字段 <= 最大值 | @field:[最小值最大值] |
最小值 < 字段 <= 最大值 | @field:[(最小最大值] |
最小值 <= 字段 < 最大值 | @field:[min (max] |
最小值 <字段 <最大值 | @field:[(最小值(最大值) |
字段 >= 最小值 | @field:[min +inf] |
字段 > 分钟 | @field:[(最小 +inf] |
字段小于等于上限 | @field:[-inf max] |
字段 <最大值 | @field:[-inf (max] |
字段 == 值 | @field:[val] |
逻辑运算符
您可以使用多个标记和数字字段构建复杂查询,并使用 逻辑运算符。
逻辑与
要设置逻辑 AND,请在谓词之间使用空格。例如:
query1 query2 query3
逻辑或
要设置逻辑 OR,请使用“|”字符。例如:
query1 | query2 | query3
逻辑否定
您可以通过在每个查询前面附加 -
来对任何查询进行否定。否定查询会返回与查询不匹配的所有条目。这也包括不含该字段的文档。
例如,针对 @genre:{comedy}
的否定查询将返回所有非喜剧图书,以及所有没有类型字段的图书。
以下查询将返回包含“comedy”的所有图书未在 2015 年至 2024 年期间发布的或没有年份字段的流派:
@genre:[comedy] -@year:[2015 2024]
组合逻辑运算符的示例
逻辑运算符可组合成复杂的过滤器表达式。
以下查询将返回包含“comedy”的所有图书或“恐怖”2015 年至 2024 年期间发布的类型 (AND):
@genre:[comedy|horror] @year:[2015 2024]
以下查询会返回 2015 年至 2024 年间出版的所有“喜剧”或“恐怖”类型图书(或):
@genre:[comedy|horror] | @year:[2015 2024]
以下查询将返回 2015 年至 2024 年间出版的所有图书,其中不含“genre”字段或“genre”字段不等于“comedy”:
-@genre:[comedy] @year:[2015 2024]
如需了解用法,请参阅 FT.SEARCH 信息。