스칼라 필터링 규칙

개요

술어 표현식은 부울 값을 출력합니다. 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 } "]";

다음 표에는 위의 부울 표현식 규칙에 언급된 각 기호에 대한 설명이 나와 있습니다.

표기법설명
=정의
,연결.
;종료.
|교대.
{...}반복.
(...)그룹화.
NILEmpty. 표현식은 빈 문자열일 수 있습니다.
INTEGER1, 2, 3과 같은 정수입니다.
FLOAT1.0, 2.0과 같은 실수입니다.
CONST정수 또는 부동숫수입니다.
IDENTIFIER식별자입니다. Milvus에서 식별자는 필드 이름을 나타냅니다.
LogicalOpLogicalOp는 하나의 비교에서 둘 이상의 관계형 연산을 결합하는 것을 지원하는 논리 연산자입니다. LogicalOp의 반환 값은 TRUE(1) 또는 FALSE(0)입니다. LogicalOps에는 BinaryLogicalOps와 UnaryLogicalOps 등 두 가지 유형이 있습니다.
단항 논리 연산단항 논리 연산자 "not"은 단항 논리 연산자를 나타냅니다.
BinaryLogicalOp두 피연산자에 대해 연산을 수행하는 이진 논리 연산자입니다. 피연산자가 두 개 이상인 복잡한 표현식에서 평가 순서는 우선순위 규칙에 따라 달라집니다.
산술 연산산술 연산자, 즉 산술 연산자는 피연산자에 대해 덧셈과 뺄셈과 같은 수학 연산을 수행합니다.
단항 연산UnaryArithOp는 단일 피연산자에 대해 연산을 수행하는 산술 연산자입니다. 음의 UnaryArithOp는 양의 식을 음의 식으로 바꾸거나 그 반대의 경우도 마찬가지입니다.
BinaryArithOp이진 연산자, 즉 BinaryArithOp는 두 피연산자에 대해 연산을 수행합니다. 피연산자가 두 개 이상인 복잡한 표현식에서 평가 순서는 우선순위 규칙에 따라 달라집니다.
CmpOpCmpOp는 두 피연산자에 대해 연산을 수행하는 관계형 연산자입니다.
CmpOpRestrictedCmpOpRestricted는 "보다 작음" 및 "같음"으로 제한됩니다.
ConstantExprConstantExpr은 Constant 또는 두 개의 ConstExpr에 대한 BinaryArithOp이거나 단일 ConstExpr에 대한 UnaryArithOp일 수 있습니다. 재귀적으로 정의됩니다.
ConstantArrayConstantArray는 대괄호로 둘러싸여 있으며, ConstantExpr은 대괄호 안에 반복될 수 있습니다. ConstArray는 하나 이상의 ConstantExpr을 포함해야 합니다.
TermExprTermExpr은 식별자 값이 ConstantArray에 나타나는지 여부를 확인하는 데 사용됩니다. TermExpr은 "in"으로 표시됩니다.
CompareExpr비교 표현식, 즉 비교 표현식은 두 개의 식별자에 대한 관계 연산, 하나의 식별자와 하나의 ConstantExpr에 대한 관계 연산, 또는 두 개의 ConstantExpr과 하나의 식별자에 대한 삼항 연산이 될 수 있습니다.
SingleExpr단일 표현식, 즉 단일 표현식은 TermExpr 또는 CompareExpr일 수 있습니다.
LogicalExprLogicalExpr은 두 개의 LogicalExpr에 대한 BinaryLogicalOp이거나 단일 LogicalExpr에 대한 UnaryLogicalOp이거나 괄호 안에 그룹화된 LogicalExpr 또는 SingleExpr일 수 있습니다. LogicalExpr은 재귀적으로 정의됩니다.
Expr식을 의미하는 약어인 Expr은 LogicalExpr 또는 NIL일 수 있습니다.
MatchOpMatchOp, 즉 일치 연산자는 문자열을 문자열 상수 또는 문자열 접두사, 접미사 또는 접미사 상수와 비교합니다.
JsonArrayOpJsonOp, 즉 JSON 연산자는 지정된 식별자에 지정된 요소가 포함되어 있는지 확인합니다.
ArrayOpArrayOp, 즉 배열 연산자는 지정된 식별자에 지정된 요소가 포함되어 있는지 여부를 확인합니다.

연산자

논리 연산자

논리 연산자는 두 표현식 간의 비교를 수행합니다.

기호연산자예제설명
'and' &&andexpr1 && expr2expr1과 expr2가 모두 참이면 참입니다.
'또는' ||또는expr1 || expr2expr1 또는 expr2 중 하나만 참이면 참입니다.

이진 산술 연산자

이진 산술 연산자는 두 개의 피연산자를 포함하며 기본적인 산술 연산을 수행하고 해당 결과를 반환할 수 있습니다.

기호연산자예제설명
+더하기a + b두 피연산자를 더합니다.
-빼기a - b첫 번째 피연산자에서 두 번째 피연산자를 뺍니다.
*곱셈a * b두 피연산자를 곱합니다.
/나눗셈a / b첫 번째 피연산자를 두 번째 피연산자로 나눕니다.
**파워a ** b첫 번째 피연산자를 두 번째 피연산자의 거듭제곱으로 올립니다.
%모듈로a % b첫 번째 피연산자를 두 번째 피연산자로 나눈 후 나머지 부분을 산출합니다.

관계형 연산자

관계형 연산자는 기호를 사용하여 두 표현식 간의 같음, 같지 않음 또는 상대적 순서를 확인합니다.

기호연산자예제설명
<미만a < ba가 b보다 작으면 참입니다.
>보다 큼a > ba가 b보다 크면 참입니다.
==같음a == ba가 b와 같으면 참입니다.
!=같지 않음a != ba가 b와 같지 않으면 참입니다.
<=보다 작거나 같음a <= ba가 b보다 작거나 같으면 참입니다.
>=보다 크거나 같음a >= ba가 b보다 크거나 같으면 참입니다.

연산자 우선순위 및 연관성

다음 표에는 연산자의 우선순위 및 연관성이 나열되어 있습니다. 연산자는 내림차순 우선순위에 따라 위에서 아래로 나열됩니다.

우선 순위연산자설명연관성
1+ -UnaryArithOp왼쪽에서 오른쪽으로
2notUnaryLogicOp오른쪽에서 왼쪽
3**BinaryArithOp왼쪽에서 오른쪽
4* / %BinaryArithOp왼쪽에서 오른쪽으로
5+ -BinaryArithOp왼쪽에서 오른쪽으로
6< <= > >=CmpOp왼쪽에서 오른쪽으로
7== !=CmpOp왼쪽에서 오른쪽으로
8좋아요MatchOp왼쪽에서 오른쪽
9json_contains JSON_CONTAINSJsonArrayOp왼쪽에서 오른쪽
9array_contains ARRAY_CONTAINSArrayOp왼쪽에서 오른쪽으로
10json_contains_all JSON_CONTAINS_ALLJsonArrayOp왼쪽에서 오른쪽으로
10array_contains_all ARRAY_CONTAINS_ALLArrayOp왼쪽에서 오른쪽으로
11json_contains_any JSON_CONTAINS_ANYJsonArrayOp왼쪽에서 오른쪽으로
11array_contains_any ARRAY_CONTAINS_ANYArrayOp왼쪽에서 오른쪽으로
12array_length ARRAY_LENGTHArrayOp왼쪽에서 오른쪽으로
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 타입의 데이터를 포함하는 스칼라 필드를 나타냅니다):

  1. CmpOp
"int64 > 0"
"0 < int64 < 400"
"500 <= int64 < 1000"
VARCHAR > "str1"
  1. BinaryLogicalOp 및 괄호
"(int64 > 0 && int64 < 400) or (int64 > 500 && int64 < 1000)"
  1. TermExpr 및 단항 논리 연산자
"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 <= 500+500"
  1. MatchOp
VARCHAR like "prefix%"
VARCHAR like "%suffix"
VARCHAR like "%middle%"
VARCHAR like "_suffix"
  1. 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
    
  1. 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에서 비트셋이 어떻게 작동하는지 알았습니다:

번역DeepL

관리형 Milvus를 무료로 사용해 보세요

Zilliz Cloud는 번거로움이 없으며, Milvus 기반으로 10배 더 빠릅니다.

시작하기
피드백

이 페이지가 도움이 되었나요?