组合查询

组合查询表达式

组合查询是多种查询类型的组合,例如:

你可以使用逻辑查询运算符将数字、标签和文本字段的查询表达式组合起来。对于向量字段,你可以将 KNN 查询与预过滤器组合使用。

注意:

根据使用的查询方言,运算符的解释会有所不同。默认的方言是 DIALECT 1;有关如何更改方言版本的信息,请参阅这篇文章。本文使用查询方言的第二版本 DIALECT 2,并使用额外的括号((...))来帮助澄清示例。更多细节请参阅查询语法文档

本文中的示例使用以下模式:

字段名称 字段类型
description TEXT
condition TAG
price NUMERIC
vector VECTOR

AND

二进制运算符(空格)用于交集两个或多个表达式的结果。

  1. FT.SEARCH index "(expr1) (expr2)"

如果你想基于特定文本字段中的多个值执行交集查询,则应该使用以下简化的表示法:

  1. FT.SEARCH index "@text_field:( value1 value2 ... )"

以下示例展示了一个查询,它查找条件为“全新”且价格范围在 500 美元到 1000 美元之间的自行车:

  1. FT.SEARCH idx:bicycle "@price:[500 1000] @condition:{new}"

你可能还对儿童自行车感兴趣。下面的查询展示了如何将全文搜索与之前查询的条件组合起来:

  1. FT.SEARCH idx:bicycle "kids (@price:[500 1000] @condition:{used})"

OR

你可以使用二进制运算符 |(竖线)来执行并集操作。

  1. FT.SEARCH index "(expr1) | (expr2)"

注意:

在使用方言版本二时,逻辑运算符 AND 优先于 OR。表达式 expr1 expr2 | expr3 expr4 表示 (expr1 expr2) | (expr3 expr4)。查询方言的版本一行为不同。在查询字符串中使用括号是推荐的做法,以确保顺序清晰。

如果你想在单个标签或文本字段内基于多个值执行并集操作,则应该使用以下简化表示法:

  1. FT.SEARCH index "@text_field:( value1 | value2 | ... )"
  1. FT.SEARCH index "@tag_field:{ value1 | value2 | ... }"

以下查询展示了如何查找包含“kids”(儿童)或“small”(小型)这两个词之一的二手自行车:

  1. FT.SEARCH index "(@description: kids | small) (@condition: used)"
  1. FT.SEARCH idx:bicycle "(kids | small) @condition:{used}"

之前的查询会在所有文本字段中进行搜索。以下示例展示了如何将搜索限制为仅在 description 字段中进行:

  1. FT.SEARCH idx:bicycle "@description:(kids | small) @condition:{used}"

如果你想将搜索扩展到新的自行车,下面的示例展示了如何做到这一点:

  1. FT.SEARCH idx:bicycle "@description:(kids | small) @condition:{new | used}"

NOT

在查询表达式前加上一个减号(-)会否定该表达式。

  1. FT.SEARCH index "-(expr)"

如果你想在之前的价格范围内排除新自行车,可以使用以下查询:

  1. FT.SEARCH idx:bicycle "@price:[500 1000] -@condition:{new}"

Numeric filter

FT.SEARCH 命令允许你将任何查询表达式与数值过滤器结合使用。

  1. FT.SEARCH index "expr" FILTER numeric_field start end

请参阅 range query article 了解更多关于数值范围查询和此类过滤器的内容。

Pre-filter for a KNN vector query

你可以使用简单或更复杂的查询表达式与逻辑运算符作为 KNN 向量查询的预过滤器。

  1. FT.SEARCH index "(filter_expr)=>[KNN num_neighbours @field $vector]" PARAMS 2 vector "binary_data" DIALECT 2

以下是一个示例:

  1. 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