스칼라 필터링 규칙
개요
술어 표현식은 부울 값을 출력합니다. Milvus는 술어로 검색하여 스칼라 필터링을 수행합니다. 술어 표현식은 평가될 때 TRUE 또는 FALSE를 반환합니다. 술어 표현식 사용에 대한 지침은 Python SDK API 참조를 참조하세요.
EBNF 문법 규칙은 부울 표현식 규칙을 설명합니다:
Expr = LogicalExpr | NIL
LogicalExpr = LogicalExpr BinaryLogicalOp LogicalExpr
| UnaryLogicalOp LogicalExpr
| "(" LogicalExpr ")"
| SingleExpr;
BinaryLogicalOp = "&&" | "and" | "||" | "or";
UnaryLogicalOp = "not";
SingleExpr = TermExpr | CompareExpr;
TermExpr = IDENTIFIER "in" ConstantArray;
Constant = INTEGER | FLOAT
ConstantExpr = Constant
| ConstantExpr BinaryArithOp ConstantExpr
| UnaryArithOp ConstantExpr;
ConstantArray = "[" ConstantExpr { "," ConstantExpr } "]";
UnaryArithOp = "+" | "-"
BinaryArithOp = "+" | "-" | "*" | "/" | "%" | "**";
CompareExpr = IDENTIFIER CmpOp IDENTIFIER
| IDENTIFIER CmpOp ConstantExpr
| ConstantExpr CmpOp IDENTIFIER
| ConstantExpr CmpOpRestricted IDENTIFIER CmpOpRestricted ConstantExpr;
CmpOpRestricted = "<" | "<=";
CmpOp = ">" | ">=" | "<" | "<=" | "=="| "!=";
MatchOp = "like" | "LIKE";
JsonArrayOps = JsonDefs "(" IDENTIFIER "," JsonExpr | JsonArray ")";
JsonArrayDefs = "json_contains" | "JSON_CONTAINS"
| "json_contains_all" | "JSON_CONTAINS_ALL"
| "json_contains_any" | "JSON_CONTAINS_ANY";
JsonExpr = Constant | ConstantArray | STRING | BOOLEAN;
JsonArray = "[" JsonExpr { "," JsonExpr } "]";
ArrayOps = ArrayDefs "(" IDENTIFIER "," ArrayExpr | Array ")";
ArrayDefs = "array_contains" | "ARRAY_CONTAINS"
| "array_contains_all" | "ARRAY_CONTAINS_ALL"
| "array_contains_any" | "ARRAY_CONTAINS_ANY"
| "array_length" | "ARRAY_LENGTH";
ArrayExpr = Constant | ConstantArray | STRING | BOOLEAN;
Array = "[" ArrayExpr { "," ArrayExpr } "]";
다음 표에는 위의 부울 표현식 규칙에 언급된 각 기호에 대한 설명이 나와 있습니다.
표기법 | 설명 |
---|---|
= | 정의 |
, | 연결. |
; | 종료. |
| | 교대. |
{...} | 반복. |
(...) | 그룹화. |
NIL | Empty. 표현식은 빈 문자열일 수 있습니다. |
INTEGER | 1, 2, 3과 같은 정수입니다. |
FLOAT | 1.0, 2.0과 같은 실수입니다. |
CONST | 정수 또는 부동숫수입니다. |
IDENTIFIER | 식별자입니다. Milvus에서 식별자는 필드 이름을 나타냅니다. |
LogicalOp | LogicalOp는 하나의 비교에서 둘 이상의 관계형 연산을 결합하는 것을 지원하는 논리 연산자입니다. LogicalOp의 반환 값은 TRUE(1) 또는 FALSE(0)입니다. LogicalOps에는 BinaryLogicalOps와 UnaryLogicalOps 등 두 가지 유형이 있습니다. |
단항 논리 연산 | 단항 논리 연산자 "not"은 단항 논리 연산자를 나타냅니다. |
BinaryLogicalOp | 두 피연산자에 대해 연산을 수행하는 이진 논리 연산자입니다. 피연산자가 두 개 이상인 복잡한 표현식에서 평가 순서는 우선순위 규칙에 따라 달라집니다. |
산술 연산 | 산술 연산자, 즉 산술 연산자는 피연산자에 대해 덧셈과 뺄셈과 같은 수학 연산을 수행합니다. |
단항 연산 | UnaryArithOp는 단일 피연산자에 대해 연산을 수행하는 산술 연산자입니다. 음의 UnaryArithOp는 양의 식을 음의 식으로 바꾸거나 그 반대의 경우도 마찬가지입니다. |
BinaryArithOp | 이진 연산자, 즉 BinaryArithOp는 두 피연산자에 대해 연산을 수행합니다. 피연산자가 두 개 이상인 복잡한 표현식에서 평가 순서는 우선순위 규칙에 따라 달라집니다. |
CmpOp | CmpOp는 두 피연산자에 대해 연산을 수행하는 관계형 연산자입니다. |
CmpOpRestricted | CmpOpRestricted는 "보다 작음" 및 "같음"으로 제한됩니다. |
ConstantExpr | ConstantExpr은 Constant 또는 두 개의 ConstExpr에 대한 BinaryArithOp이거나 단일 ConstExpr에 대한 UnaryArithOp일 수 있습니다. 재귀적으로 정의됩니다. |
ConstantArray | ConstantArray는 대괄호로 둘러싸여 있으며, ConstantExpr은 대괄호 안에 반복될 수 있습니다. ConstArray는 하나 이상의 ConstantExpr을 포함해야 합니다. |
TermExpr | TermExpr은 식별자 값이 ConstantArray에 나타나는지 여부를 확인하는 데 사용됩니다. TermExpr은 "in"으로 표시됩니다. |
CompareExpr | 비교 표현식, 즉 비교 표현식은 두 개의 식별자에 대한 관계 연산, 하나의 식별자와 하나의 ConstantExpr에 대한 관계 연산, 또는 두 개의 ConstantExpr과 하나의 식별자에 대한 삼항 연산이 될 수 있습니다. |
SingleExpr | 단일 표현식, 즉 단일 표현식은 TermExpr 또는 CompareExpr일 수 있습니다. |
LogicalExpr | LogicalExpr은 두 개의 LogicalExpr에 대한 BinaryLogicalOp이거나 단일 LogicalExpr에 대한 UnaryLogicalOp이거나 괄호 안에 그룹화된 LogicalExpr 또는 SingleExpr일 수 있습니다. LogicalExpr은 재귀적으로 정의됩니다. |
Expr | 식을 의미하는 약어인 Expr은 LogicalExpr 또는 NIL일 수 있습니다. |
MatchOp | MatchOp, 즉 일치 연산자는 문자열을 문자열 상수 또는 문자열 접두사, 접미사 또는 접미사 상수와 비교합니다. |
JsonArrayOp | JsonOp, 즉 JSON 연산자는 지정된 식별자에 지정된 요소가 포함되어 있는지 확인합니다. |
ArrayOp | ArrayOp, 즉 배열 연산자는 지정된 식별자에 지정된 요소가 포함되어 있는지 여부를 확인합니다. |
연산자
논리 연산자
논리 연산자는 두 표현식 간의 비교를 수행합니다.
기호 | 연산자 | 예제 | 설명 |
---|---|---|---|
'and' && | and | expr1 && expr2 | expr1과 expr2가 모두 참이면 참입니다. |
'또는' || | 또는 | expr1 || expr2 | expr1 또는 expr2 중 하나만 참이면 참입니다. |
이진 산술 연산자
이진 산술 연산자는 두 개의 피연산자를 포함하며 기본적인 산술 연산을 수행하고 해당 결과를 반환할 수 있습니다.
기호 | 연산자 | 예제 | 설명 |
---|---|---|---|
+ | 더하기 | 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와 같지 않으면 참입니다. |
<= | 보다 작거나 같음 | a <= b | a가 b보다 작거나 같으면 참입니다. |
>= | 보다 크거나 같음 | a >= b | a가 b보다 크거나 같으면 참입니다. |
연산자 우선순위 및 연관성
다음 표에는 연산자의 우선순위 및 연관성이 나열되어 있습니다. 연산자는 내림차순 우선순위에 따라 위에서 아래로 나열됩니다.
우선 순위 | 연산자 | 설명 | 연관성 |
---|---|---|---|
1 | + - | UnaryArithOp | 왼쪽에서 오른쪽으로 |
2 | not | UnaryLogicOp | 오른쪽에서 왼쪽 |
3 | ** | BinaryArithOp | 왼쪽에서 오른쪽 |
4 | * / % | BinaryArithOp | 왼쪽에서 오른쪽으로 |
5 | + - | BinaryArithOp | 왼쪽에서 오른쪽으로 |
6 | < <= > >= | CmpOp | 왼쪽에서 오른쪽으로 |
7 | == != | CmpOp | 왼쪽에서 오른쪽으로 |
8 | 좋아요 | MatchOp | 왼쪽에서 오른쪽 |
9 | json_contains JSON_CONTAINS | JsonArrayOp | 왼쪽에서 오른쪽 |
9 | array_contains ARRAY_CONTAINS | ArrayOp | 왼쪽에서 오른쪽으로 |
10 | json_contains_all JSON_CONTAINS_ALL | JsonArrayOp | 왼쪽에서 오른쪽으로 |
10 | array_contains_all ARRAY_CONTAINS_ALL | ArrayOp | 왼쪽에서 오른쪽으로 |
11 | json_contains_any JSON_CONTAINS_ANY | JsonArrayOp | 왼쪽에서 오른쪽으로 |
11 | array_contains_any ARRAY_CONTAINS_ANY | ArrayOp | 왼쪽에서 오른쪽으로 |
12 | array_length ARRAY_LENGTH | ArrayOp | 왼쪽에서 오른쪽으로 |
13 | && 및 | BinaryLogicOp | 왼쪽에서 오른쪽으로 |
14 | || 또는 | BinaryLogicOp | 왼쪽에서 오른쪽 |
표현식은 일반적으로 왼쪽에서 오른쪽으로 평가됩니다. 복잡한 표현식은 한 번에 하나씩 평가됩니다. 표현식이 평가되는 순서는 사용된 연산자의 우선순위에 따라 결정됩니다.
표현식에 우선 순위가 같은 연산자가 두 개 이상 포함된 경우 왼쪽에 있는 연산자가 먼저 평가됩니다.
예를 들어 10 / 2 * 5는 (10 / 2)로 평가되고 결과에 5가 곱해집니다.
우선 순위가 낮은 연산을 먼저 처리해야 하는 경우 괄호 안에 넣어야 합니다.
예를 들어 30 / 2 + 8입니다. 이는 일반적으로 30을 2로 나눈 다음 결과에 8을 더한 것으로 평가됩니다. 2 + 8로 나누려면 30 / (2 + 8)로 작성해야 합니다.
괄호는 표현식 안에 중첩할 수 있습니다. 가장 안쪽 괄호 안의 표현식이 먼저 평가됩니다.
사용법
Milvus에서 사용 가능한 모든 부울 표현식 사용 예시는 다음과 같습니다(int64
는 INT64 타입의 데이터를 포함하는 스칼라 필드, float
는 부동 소수점 타입의 데이터를 포함하는 스칼라 필드, VARCHAR
는 VARCHAR 타입의 데이터를 포함하는 스칼라 필드를 나타냅니다):
- CmpOp
"int64 > 0"
"0 < int64 < 400"
"500 <= int64 < 1000"
VARCHAR > "str1"
- BinaryLogicalOp 및 괄호
"(int64 > 0 && int64 < 400) or (int64 > 500 && int64 < 1000)"
- TermExpr 및 단항 논리 연산자
"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 <= 500+500"
- MatchOp
VARCHAR like "prefix%"
VARCHAR like "%suffix"
VARCHAR like "%middle%"
VARCHAR like "_suffix"
- JsonArrayOp
JSON_CONTAINS(identifier, JsonExpr)
JSON_CONTAINS
(두 번째 인수) 문의 JSON 표현식이 목록인 경우 식별자(첫 번째 인수)는 목록의 목록이어야 합니다. 그렇지 않으면 문은 항상 False로 평가됩니다.# {"x": [1,2,3]} json_contains(x, 1) # ==> true json_contains(x, "a") # ==> false # {"x": [[1,2,3], [4,5,6], [7,8,9]]} json_contains(x, [1,2,3]) # ==> true json_contains(x, [3,2,1]) # ==> false
JSON_CONTAINS_ALL(identifier, JsonExpr)
JSON_CONTAINS_ALL
문의 JSON 표현식은 항상 목록이어야 합니다.# {"x": [1,2,3,4,5,7,8]} json_contains_all(x, [1,2,8]) # ==> true json_contains_all(x, [4,5,6]) # ==> false 6 is not exists
JSON_CONTAINS_ANY(identifier, JsonExpr)
JSON_CONTAINS_ANY
문의 JSON 표현식은 항상 목록이어야 합니다. 그렇지 않으면JSON_CONTAINS
와 동일하게 작동합니다.# {"x": [1,2,3,4,5,7,8]} json_contains_any(x, [1,2,8]) # ==> true json_contains_any(x, [4,5,6]) # ==> true json_contains_any(x, [6,9]) # ==> false
- ArrayOp
ARRAY_CONTAINS(identifier, ArrayExpr)
ARRAY_CONTAINS
(두 번째 인수) 문의 배열 표현식이 목록인 경우 식별자(첫 번째 인수)는 목록의 목록이어야 합니다. 그렇지 않으면 문은 항상 False로 평가됩니다.# 'int_array': [1,2,3] array_contains(int_array, 1) # ==> true array_contains(int_array, "a") # ==> false
ARRAY_CONTAINS_ALL(identifier, ArrayExpr)
ARRAY_CONTAINS_ALL
문의 배열 표현식은 항상 목록이어야 합니다.# "int_array": [1,2,3,4,5,7,8] array_contains_all(int_array, [1,2,8]) # ==> true array_contains_all(int_array, [4,5,6]) # ==> false 6 is not exists
ARRAY_CONTAINS_ANY(identifier, ArrayExpr)
ARRAY_CONTAINS_ANY
문의 배열 표현식은 항상 목록이어야 합니다. 그렇지 않으면ARRAY_CONTAINS
와 동일하게 작동합니다.# "int_array": [1,2,3,4,5,7,8] array_contains_any(int_array, [1,2,8]) # ==> true array_contains_any(int_array, [4,5,6]) # ==> true array_contains_any(int_array, [6,9]) # ==> false
ARRAY_LENGTH(identifier)
배열의 요소 수를 확인합니다.
# "int_array": [1,2,3,4,5,7,8] array_length(int_array) # ==> 7
다음 단계
이제 Milvus에서 비트셋이 어떻게 작동하는지 알았습니다:
- 하이브리드 검색을 수행하는 방법을 알아보세요.
- 문자열을 사용하여 검색 결과를 필터링하는 방법을 알아보세요.
- 부울 표현식을 작성할 때 동적 필드를 사용하는 방법을 알아보세요.