milvus-logo
LFAI
홈페이지
  • 사용자 가이드

스칼라 필터링 규칙

개요

술어 표현식은 부울 값을 출력합니다. 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에서 비트셋이 어떻게 작동하는지 알았습니다:

번역DeepLogo

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started
피드백

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