부울 표현식 규칙

이 장에서는 쿼리 조건 표현식을 작성하는 방법을 소개합니다.

개요

술어 표현식은 부울 값을 출력합니다. Milvus는 술어를 사용하여 스칼라 값을 필터링합니다. 술어 표현식을 평가할 때 TRUE 또는 FALSE를 반환합니다. 술어 표현식 사용에 대한 안내는 Python SDK API 참조를 참고하십시오.

연산자

논리 연산자

논리 연산자는 두 표현식을 비교합니다.

기호 연산 예제 설명
'and' && AND expr1 && expr2 expr1과 expr2가 모두 true일 때 True를 반환합니다.
'or' || OR expr1 || expr2 expr1 또는 expr2 중 하나가 true이면 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 Json 배열 연산자 좌측에서 우측으로
10 json_contains_all JSON_CONTAINS_ALL Json 배열 연산자 좌측에서 우측으로
11 json_contains_any JSON_CONTAINS_ANY Json 배열 연산자 좌측에서 우측으로
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)"
  1. in 표현식

Milvus는 명시적으로 정의된 주 키를 가진 엔티티만 삭제를 지원하며, 이는 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