스칼라 필터링 규칙
개요
술어 표현식은 부울 값을 출력합니다. 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]) # ==> falseJSON_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 existsJSON_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") # ==> falseARRAY_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 existsARRAY_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]) # ==> falseARRAY_LENGTH(identifier)배열의 요소 수를 확인합니다.
# "int_array": [1,2,3,4,5,7,8] array_length(int_array) # ==> 7
다음 단계
이제 Milvus에서 비트셋이 어떻게 작동하는지 알았습니다:
- 하이브리드 검색을 수행하는 방법을 알아보세요.
- 문자열을 사용하여 검색 결과를 필터링하는 방법을 알아보세요.
- 부울 표현식을 작성할 때 동적 필드를 사용하는 방법을 알아보세요.