组合查询
组合查询表达式
组合查询是多种查询类型的组合,例如:
你可以使用逻辑查询运算符将数字、标签和文本字段的查询表达式组合起来。对于向量字段,你可以将 KNN 查询与预过滤器组合使用。
注意:
根据使用的查询方言,运算符的解释会有所不同。默认的方言是 DIALECT 1
;有关如何更改方言版本的信息,请参阅这篇文章。本文使用查询方言的第二版本 DIALECT 2
,并使用额外的括号((...)
)来帮助澄清示例。更多细节请参阅查询语法文档。
本文中的示例使用以下模式:
字段名称 | 字段类型 |
---|---|
description |
TEXT |
condition |
TAG |
price |
NUMERIC |
vector |
VECTOR |
AND
二进制运算符(空格)用于交集两个或多个表达式的结果。
FT.SEARCH index "(expr1) (expr2)"
如果你想基于特定文本字段中的多个值执行交集查询,则应该使用以下简化的表示法:
FT.SEARCH index "@text_field:( value1 value2 ... )"
以下示例展示了一个查询,它查找条件为“全新”且价格范围在 500 美元到 1000 美元之间的自行车:
FT.SEARCH idx:bicycle "@price:[500 1000] @condition:{new}"
你可能还对儿童自行车感兴趣。下面的查询展示了如何将全文搜索与之前查询的条件组合起来:
FT.SEARCH idx:bicycle "kids (@price:[500 1000] @condition:{used})"
OR
你可以使用二进制运算符 |
(竖线)来执行并集操作。
FT.SEARCH index "(expr1) | (expr2)"
注意:
在使用方言版本二时,逻辑运算符 AND
优先于 OR
。表达式 expr1 expr2 | expr3 expr4
表示 (expr1 expr2) | (expr3 expr4)
。查询方言的版本一行为不同。在查询字符串中使用括号是推荐的做法,以确保顺序清晰。
如果你想在单个标签或文本字段内基于多个值执行并集操作,则应该使用以下简化表示法:
FT.SEARCH index "@text_field:( value1 | value2 | ... )"
FT.SEARCH index "@tag_field:{ value1 | value2 | ... }"
以下查询展示了如何查找包含“kids”(儿童)或“small”(小型)这两个词之一的二手自行车:
FT.SEARCH index "(@description: kids | small) (@condition: used)"
FT.SEARCH idx:bicycle "(kids | small) @condition:{used}"
之前的查询会在所有文本字段中进行搜索。以下示例展示了如何将搜索限制为仅在 description 字段中进行:
FT.SEARCH idx:bicycle "@description:(kids | small) @condition:{used}"
如果你想将搜索扩展到新的自行车,下面的示例展示了如何做到这一点:
FT.SEARCH idx:bicycle "@description:(kids | small) @condition:{new | used}"
NOT
在查询表达式前加上一个减号(-
)会否定该表达式。
FT.SEARCH index "-(expr)"
如果你想在之前的价格范围内排除新自行车,可以使用以下查询:
FT.SEARCH idx:bicycle "@price:[500 1000] -@condition:{new}"
Numeric filter
FT.SEARCH 命令允许你将任何查询表达式与数值过滤器结合使用。
FT.SEARCH index "expr" FILTER numeric_field start end
请参阅 range query article 了解更多关于数值范围查询和此类过滤器的内容。
Pre-filter for a KNN vector query
你可以使用简单或更复杂的查询表达式与逻辑运算符作为 KNN 向量查询的预过滤器。
FT.SEARCH index "(filter_expr)=>[KNN num_neighbours @field $vector]" PARAMS 2 vector "binary_data" DIALECT 2
以下是一个示例:
FT.SEARCH idx:bikes_vss "(@price:[500 1000] @condition:{new})=>[KNN 3 @vector $query_vector]" PARAMS 2 "query_vector" "Z\xf8\x15:\xf23\xa1\xbfZ\x1dI>\r\xca9..." DIALECT 2