一架梯子,一头程序猿,仰望星空!
Milvus向量数据库教程 > 内容正文

Milvus 查询条件布尔表达式规则


布尔表达式规则

本章介绍查询条件表达式怎么写。

概述

谓词表达式输出一个布尔值。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类型数据的标量字段):

  1. 比较表达式
"int64 > 0"
"0 < int64 < 400"
"500 < int64"
VARCHAR > "str1"
  1. 逻辑操作和括号
"(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"]
  1. TermExpr,BinaryLogicalOp和CmpOp(在不同字段上)
"int64 in [1, 2, 3] and float != 2"
  1. BinaryLogicalOp和CmpOp
"int64 == 0 || int64 == 1 || int64 == 2"
  1. CmpOp和UnaryArithOp或BinaryArithOp
"200+300 < int64"
  1. MatchOp(前缀匹配)
VARCHAR like "prefix%"
  1. 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


关联主题