id: boolean.md

布尔表达式语法规则

{{fragments/translation_needed.md}}

表达式计算结果将输出布尔值——真(TRUE)或假(False)。在搜索向量时,Milvus 通过表达式进行标量过滤。查看 Python SDK API 参考以了解表达式使用说明。

扩展巴科斯范式(EBNF)语法规则中定义了布尔表达式的语法规则。布尔表达式的语法规则如下所示:

  1. Expr = LogicalExpr | NIL
  2. LogicalExpr = LogicalExpr BinaryLogicalOp LogicalExpr
  3. | UnaryLogicalOp LogicalExpr
  4. | "(" LogicalExpr ")"
  5. | SingleExpr;
  6. BinaryLogicalOp = "&&" | "and" | "||" | "or";
  7. UnaryLogicalOp = "not";
  8. SingleExpr = TermExpr | CompareExpr;
  9. TermExpr = IDENTIFIER "in" ConstantArray;
  10. Constant = INTERGER | FLOAT
  11. ConstantExpr = Constant
  12. | ConstantExpr BinaryArithOp ConstantExpr
  13. | UnaryArithOp ConstantExpr;
  14. ConstantArray = "[" ConstantExpr { "," ConstantExpr } "]";
  15. UnaryArithOp = "+" | "-"
  16. BinaryArithOp = "+" | "-" | "*" | "/" | "%" | "**";
  17. CompareExpr = IDENTIFIER CmpOp IDENTIFIER
  18. | IDENTIFIER CmpOp ConstantExpr
  19. | ConstantExpr CmpOp IDENTIFIER
  20. | ConstantExpr CmpOpRestricted IDENTIFIER CmpOpRestricted ConstantExpr;
  21. CmpOpRestricted = "<" | "<=";
  22. CmpOp = ">" | ">=" | "<" | "<=" | "=="| "!=";

上述布尔表达式规则中提及的符号及其含义请见下表。

表达式 含义
= 定义。
, 串联。
; 终止。
\ 交替。
{…} 重复。
(…) 分组。
NIL 空值。表达式可以为空字符串。
INTEGER 整数,如 1、2、3 等。
FLOAT 浮点数,如 1.0、2.0。
CONST 整数或浮点数。
IDENTIFIER 标识符。在 Milvus 用来表示 Field 名称。
LogicalOp LogicalOp 包括 BinaryLogicalOp 及 UnaryLogicalOp,支持在一次比较运算中包含多种逻辑关系。LogicalOp 返回结果为 TRUE (1) 或 FALSE (0)。
UnaryLogicalOp 一元逻辑运算符 ‘否’。
BinaryLogicalOp 在运算元数量大于等于 2 的复杂表达式中,运算先后顺序由运算符的优先级决定。
ArithmeticOp ArithmeticOp 计算数学关系,如加法、减法等。
UnaryArithOp UnaryArithOp 表达式中仅包含 1 个运算元。一元否定运算符会将表达式中符号的含义从肯定变为否定,或从否定变为肯定。
BinaryArithOp 在运算元数量大于等于 2 的复杂表达式中,运算先后顺序由运算符的优先级决定。
CmpOp 关系运算符。
CmpOpRestricted 仅指代 “小于” 以及 “小于或等于”。
ConstantExpr ConstantExpr 可用于面向 2 个 ConstantExpr 的常量的BinaryArithOp,或面向 1 个 ConstantExpr 的 UnaryArithOp。ConstantExpr 的定义方式为递归定义。
ConstantArray 使用方括号来表示 ConstantArray。ConstantExpr 可在方括号内重复。ConstantArray 必须包含至少 1 个ConstantExpr。
TermExpr TermExpr 用于检查 IDENTIFIER 的值是否出现在 ConstantArray 中。TermExpr 由 “in” 来表示。
CompareExpr CompareExpr 可用于面向 2 个 IDENTIFIER 或面向 1 个 IDENTIFIER 和 1 个 ConstantExpr 的关系运算。CompareExpr 还可以运用于面向 2 个 ConstantExpr 和 1 个 IDENTIFIER 的三元运算。
SingleExpr SingleExpr 可以是 TermExpr 或 CompareExpr。
LogicalExpr LogicalExpr 可以是面向 2 个 LogicalExpr 的 BinaryLogicalOp,或面向 1 个 LogicalExpr 的 UnaryLogicalOp,或是1 个按括号分组的 LogicalExpr、或是1 个 SingleExpr。LogicalExpr 的定义方式为递归定义。
Expr Expr 可以是 LogicalExpr 或 NIL。

运算符

逻辑运算

逻辑运算符用于将条件进行关联。它们对这些条件返回的布尔值执行逻辑运算。

符号 运算 示例 规则
且运算符(&&) and expr1 && expr2 若 expr1 和 expr2 两个均为 true,则结果为 true。
或运算符(\ \ or expr1 \ \ expr2 若 expr1 或 expr2 中任意一个为 true,则结果为 true。

二元算数运算符

二元算数运算符用于运算两个运算元之间的基本算数关系,并返回相应结果。

符号 运算 示例 规则
+ a + b 计算 a 与 b 的和。
- a - b 计算 a 与 b 的差。
* a * b 计算 a 与 b 的乘积。
/ 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 + - 一元算数运算符(UnaryArithOp) 从左到右
2 not 一元逻辑运算符(UnaryLogicalOp) 从右到左
3 ** 二元算数运算符(BinaryArithOp) 从左到右
4 * / % 二元算数运算符(BinaryArithOp) 从左到右
5 + - 二元算数运算符(BinaryArithOp) 从左到右
6 < <= > >= 二元算数运算符(BinaryArithOp) 从左到右
7 == != 比较运算符(CmpOp) 从左到右
8 && and 二元逻辑运算符(BinaryLogicalOp) 从左到右
9 \ \ or 二元逻辑运算符(BinaryLogicalOp) 从左到右

表达式运算通常遵循从左到右的计算规则。一次只能计算一种复杂表达式。运算先后顺序由运算符的优先级决定。

如果表达式中包含两个或以上同等优先级的运算符,运算时从左到右进行。

例如,10 / 2 * 5 的运算过程为 (10 / 2) 的商乘以 5。

若需要先处理低优先级的运算,请使用括号。

例如,30 / 2 + 8 的运算过程为 30 除以 2 的商加 8。若你想计算 30 除以 2 加 8 的和 10,则应将表达式写作 30 / (2 + 8).

你可以在表达式中使用括号。运算时先计算最内层括号内的表达式。

Usage

Samples of all available boolean expression usage in Milvus are listed as follows (int64 represents the scalar field that contains data of INT64 type, and float represents the scalar field that contains data of floating-point type):

  1. CmpOp
  1. "int64 > 0"
  1. "0 < int64 < 400"
  1. "500 <= int64 < 1000"
  1. BinaryLogicalOp and parentheses
  1. "(int64 > 0 && int64 < 400) or (int64 > 500 && int64 < 1000)"
  1. TermExpr and UnaryLogicOp
Milvus only supports deleting entities with clearly specified primary keys, which can be achieved merely with the term expression in.
  1. "int64 not in [1, 2, 3]"
  1. TermExpr, BinaryLogicalOp, and CmpOp (on different fields)
  1. "int64 in [1, 2, 3] and float != 2"
  1. BinaryLogicalOp and CmpOp
  1. "int64 == 0 || int64 == 1 || int64 == 2"
  1. CmpOp and UnaryArithOp or BinaryArithOp
  1. "200+300 < int64 <= 500+500"