布尔表达式规则
本章介绍查询条件表达式怎么写。
概述
谓词表达式输出一个布尔值。Milvus通过使用谓词来进行标量过滤。当对谓词表达式进行评估时,将返回TRUE或FALSE。请查看Python SDK API参考,了解如何使用谓词表达式的指导。
运算符
逻辑运算符
逻辑运算符对两个表达式进行比较。
符号 | 操作 | 示例 | 描述 | ||||
---|---|---|---|---|---|---|---|
‘and’ && | 与 | expr1 && expr2 | 当expr1和expr2都为真时返回True。 | ||||
‘or’ \ | \ | 或 | expr1 \ | \ | expr2 | 当expr1或expr2为真时返回True。 |
二进制算术运算符
二进制算术运算符包含两个操作数,可以进行基本的算术运算并返回相应的结果。
符号 | 操作 | 示例 | 描述 |
---|---|---|---|
+ | 加法 | a + b | 将两个操作数相加。 |
- | 减法 | a - b | 将第二个操作数从第一个操作数中减去。 |
* | 乘法 | a * b | 将两个操作数相乘。 |
/ | 除法 | a / b | 将第一个操作数除以第二个操作数。 |
** | 幂 | a ** b | 将第一个操作数的幂乘以第二个操作数。 |
% | 取模 | a % b | 将第一个操作数除以第二个操作数,取余数部分。 |
关系运算符
关系运算符使用符号来检查两个表达式之间的相等性、不等性或相对顺序。
符号 | 操作 | 示例 | 描述 |
---|---|---|---|
< | 小于 | a < b | 如果a小于b,则返回True。 |
> | 大于 | a > b | 如果a大于b,则返回True。 |
== | 等于 | a == b | 如果a等于b,则返回True。 |
!= | 不等于 | a != b | 如果a不等于b,则返回True。 |
<= | 小于等于 | a <= b | 如果a小于等于b,则返回True。 |
>= | 大于等于 | a >= b | 如果a大于等于b,则返回True。 |
运算符优先级和结合性
下表列出了运算符的优先级和结合性。运算符按照优先级从上到下列出。
优先级 | 运算符 | 描述 | 结合性 | ||
---|---|---|---|---|---|
1 | + - | 一元算术运算符 | 从左到右 | ||
2 | not | 一元逻辑运算符 | 从右到左 | ||
3 | ** | 二元算术运算符 | 从左到右 | ||
4 | * / % | 二元算术运算符 | 从左到右 | ||
5 | + - | 二元算术运算符 | 从左到右 | ||
6 | < <= > >= | 比较运算符 | 从左到右 | ||
7 | == != | 比较运算符 | 从左到右 | ||
8 | like LIKE | 匹配运算符 | 从左到右 | ||
9 | json_contains JSON_CONTAINS | JsonArray运算符 | 从左到右 | ||
10 | json_contains_all JSON_CONTAINS_ALL | JsonArray运算符 | 从左到右 | ||
11 | json_contains_any JSON_CONTAINS_ANY | JsonArray运算符 | 从左到右 | ||
12 | && and | 二元逻辑运算符 | 从左到右 | ||
13 | \ | \ | or | 二元逻辑运算符 | 从左到右 |
表达式通常从左到右进行计算。复杂表达式逐个进行计算。表达式的计算顺序由所使用运算符的优先级决定。
如果一个表达式包含两个或多个具有相同优先级的运算符,将首先计算左边的运算符。
例如,10 / 2 * 5将被计算为(10 / 2)并将结果乘以5。
当需要先处理较低优先级的运算时,应将其括在括号中。
例如,30 / 2 + 8。通常会将其计算为30除以2,然后将8加到结果上。如果要除以2 + 8,应该写为30 / (2 + 8)。
括号可以嵌套在表达式中。最内层的括号先进行计算。
条件例子
Milvus中所有可用布尔表达式的示例如下所示(int64
表示包含INT64类型数据的标量字段,float
表示包含浮点数类型数据的标量字段,VARCHAR
表示包含VARCHAR类型数据的标量字段):
- 比较表达式
"int64 > 0"
"0 < int64 < 400"
"500 < int64"
VARCHAR > "str1"
- 逻辑操作和括号
"(int64 > 0 && int64 < 400) or (int64 > 500 && int64 < 1000)"
3.in表达式
Milvus仅支持使用明确定义的主键删除实体,这只能通过term表达式in
来实现。
"int64 not in [1, 2, 3]"
VARCHAR not in ["str1", "str2"]
- TermExpr,BinaryLogicalOp和CmpOp(在不同字段上)
"int64 in [1, 2, 3] and float != 2"
- BinaryLogicalOp和CmpOp
"int64 == 0 || int64 == 1 || int64 == 2"
- CmpOp和UnaryArithOp或BinaryArithOp
"200+300 < int64"
- MatchOp(前缀匹配)
VARCHAR like "prefix%"
- JsonArrayOp
JSON_CONTAINS(identifier, JsonExpr)
如果
JSON_CONTAINS
(第二个参数)语句的JSON表达式是一个列表,则标识符(第一个参数)应为列表的列表。否则,该语句始终计算为False。
json_contains(x, 1) # ==> true
json_contains(x, "a") # ==> false
json_contains(x, [1,2,3]) # ==> true
json_contains(x, [3,2,1]) # ==> false
JSON_CONTAINS_ALL(identifier, JsonExpr)
JSON_CONTAINS_ALL
语句中的JSON表达式应始终为列表。
json_contains_all(x, [1,2,8]) # ==> true
json_contains_all(x, [4,5,6]) # ==> false 6不存在
JSON_CONTAINS_ANY(identifier, JsonExpr)
JSON_CONTAINS_ANY
语句中的JSON表达式应始终为列表。否则,它的行为与JSON_CONTAINS
相同。
json_contains_any(x, [1,2,8]) # ==> true
json_contains_any(x, [4,5,6]) # ==> true
json_contains_any(x, [6,9]) # ==> false