본문 바로가기
WIKI 기술 지식 베이스

기본 연산자 (Basic Operators)

원문 보기 위키 갱신

Milvus는 데이터를 효율적으로 필터링하고 쿼리하는 데 도움이 되는 풍부한 기본 연산자 세트를 제공해요. 이 연산자들을 사용하면 스칼라 필드, 숫자 계산, 논리 조건 등을 기준으로 검색 조건을 정제할 수 있어요. 이 연산자들을 이해하는 것은 정밀한 쿼리를 구축하고 검색 효율을 극대화하는 데 중요해요.

출처: Milvus 문서

본문

비교 연산자 (Comparison operators)

비교 연산자는 동등성, 부등성, 크기를 기준으로 데이터를 필터링하는 데 사용돼요. 숫자 및 텍스트 필드에 적용할 수 있어요.

지원되는 비교 연산자 (Supported comparison operators)

  • == (같음)
  • != (같지 않음)
  • > (보다 큼)
  • < (보다 작음)
  • >= (크거나 같음)
  • <= (작거나 같음)

예시 1: 같음(==)으로 필터링 (Example 1: Filtering with equal to)

status라는 필드가 있고 status가 "active"인 모든 엔티티를 찾고 싶다고 가정해요. 같음 연산자 ==를 사용할 수 있어요.

filter = 'status == "active"'

예시 2: 같지 않음(!=)으로 필터링 (Example 2: Filtering with not equal to)

status가 "inactive"가 아닌 엔티티를 찾으려면:

filter = 'status != "inactive"'

예시 3: 보다 큼(>)으로 필터링 (Example 3: Filtering with greater than)

age가 30보다 큰 모든 엔티티를 찾으려면:

filter = 'age > 30'

예시 4: 보다 작음으로 필터링 (Example 4: Filtering with less than)

price가 100보다 작은 엔티티를 찾으려면:

filter = 'price < 100'

예시 5: 크거나 같음(>=)으로 필터링 (Example 5: Filtering with greater than or equal to)

rating이 4보다 크거나 같은 모든 엔티티를 찾으려면:

filter = 'rating >= 4'

예시 6: 작거나 같음으로 필터링 (Example 6: Filtering with less than or equal to)

discount가 10%보다 작거나 같은 엔티티를 찾으려면:

filter = 'discount <= 10'

범위 연산자 (Range operators)

범위 연산자는 특정 값 집합을 기준으로 데이터를 필터링하는 데 도움을 줘요. Milvus는 집합 멤버십 확인을 위해 IN을 지원해요.

color가 "red", "green", "blue" 중 하나인 모든 엔티티를 찾으려면:

filter = 'color in ["red", "green", "blue"]'

이는 값 목록에서 멤버십을 확인하려고 할 때 유용해요.

패턴 매칭 연산자 (Pattern matching operators)

패턴 매칭 연산자는 와일드카드 패턴이나 정규식을 기반으로 문자열 값을 필터링하는 데 도움을 줘요.

  • LIKE: 문자열 값에서 간단한 와일드카드 패턴을 매칭하는 데 사용돼요. 예를 들어 name LIKE "Prod%"는 Prod로 시작하는 값과 일치해요.
  • =~: 문자열 값을 RE2 정규식과 매칭하는 데 사용돼요. 예를 들어 code =~ "E[0-9]{4}"는 E1001 같은 오류 코드를 포함하는 값과 일치해요.
  • !~: RE2 정규식과 일치하는 문자열 값을 제외하는 데 사용돼요. 이는 NOT (field =~ "pattern")과 동등해요.

name이 Prod로 시작하는 엔티티를 찾으려면:

filter = 'name LIKE "Prod%"'

code가 E1001 같은 오류 코드를 포함하는 엔티티를 찾으려면:

filter = 'code =~ "E[0-9]{4}"'

message가 DEBUG로 시작하는 엔티티를 제외하려면:

filter = 'message !~ "^DEBUG"'

LIKE와 regex 중 선택, 지원되는 필드 타입, regex 구문, 이스케이프 규칙, 성능에 대한 자세한 내용은 Pattern Matching을 참고하세요. Milvus는 또한 VARCHAR 필드나 JSON 문자열 경로에 NGRAM 인덱스를 구축해 적격한 패턴 매칭 필터를 가속화할 수 있게 해줘요. 자세한 내용은 NGRAM을 참고하세요.

산술 연산자 (Arithmetic operators)

산술 연산자를 사용하면 숫자 필드가 포함된 계산을 기반으로 조건을 만들 수 있어요.

지원되는 산술 연산자 (Supported arithmetic operators)

  • + (더하기)
  • - (빼기)
  • * (곱하기)
  • / (나누기)
  • % (나머지)
  • ** (거듭제곱)

예시 1: 나머지(%) 사용 (Example 1: Using modulus)

id가 짝수(즉 2로 나누어 떨어지는)인 엔티티를 찾으려면:

filter = 'id % 2 == 0'

예시 2: 거듭제곱(**) 사용 (Example 2: Using exponentiation)

price를 2 제곱한 값이 1000보다 큰 엔티티를 찾으려면:

filter = 'price ** 2 > 1000'

비트 연산자 (Bitwise operators)

Milvus 3.0.0+와 호환돼요.

비트 연산자는 정수 필드가 권한, 기능 플래그, 상태 비트 같은 여러 플래그를 인코딩할 때 유용해요. 필터 표현식에서 이러한 연산자를 사용해 정수 값의 개별 비트를 확인, 결합, 비교할 수 있어요.

스칼라 필드의 경우 비트 연산자는 INT8, INT16, INT32, INT64 같은 정수 필드 타입에 적용돼요.

지원되는 비트 연산자 (Supported bitwise operators)

연산자 이름 일반적인 용도
& 비트 AND 특정 비트가 설정되어 있는지 확인.
` ` 비트 OR
^ 비트 XOR 두 값 사이의 비트 차이 비교.

예시: 권한 비트로 필터링 (Example: Filtering by permission bits)

permissions라는 정수 필드가 있고 각 비트가 권한 플래그를 나타낸다고 가정해요.

권한 플래그 비트 값
READ 1
WRITE 2
SHARE 4
ADMIN 8

예를 들어 permissions = 5는 READ와 SHARE 비트가 설정되었음을 의미해요. 5 = 1 + 4이기 때문이죠.

SHARE 비트가 설정된 엔티티를 찾으려면 비트 AND(&)를 사용해요.

filter = "(permissions & 4) == 4"

WRITE 비트를 설정하면 READ + WRITE + SHARE 권한 집합이 되는 엔티티를 찾으려면 비트 OR(|)를 사용해요.

filter = "(permissions | 2) == 7"

권한 비트가 READ + WRITE + SHARE와 WRITE 비트 하나만 다르게 다른 엔티티를 찾으려면 비트 XOR(^)를 사용해요.

filter = "(permissions ^ 7) == 2"

결과를 비교하기 전에 항상 비트 연산을 괄호로 감싸야 해요. 예: (permissions & 4) == 4. Milvus 3.0.0은 필터 표현식에서 &, |, ^를 지원해요. 비트 NOT(~)과 시프트 연산자(<<, >>)는 지원되지 않아요.

논리 연산자 (Logical operators)

논리 연산자는 여러 조건을 더 복잡한 필터 표현식으로 결합하는 데 사용돼요. 여기에는 AND, OR, NOT이 포함돼요.

지원되는 논리 연산자 (Supported logical operators)

  • AND: 모두 참이어야 하는 여러 조건을 결합해요.
  • OR: 적어도 하나는 참이어야 하는 조건을 결합해요.
  • NOT: 조건을 부정해요.

예시 1: AND로 조건 결합 (Example 1: Using AND to combine conditions)

price가 100보다 크고 stock이 50보다 큰 모든 제품을 찾으려면:

filter = 'price > 100 AND stock > 50'

예시 2: OR로 조건 결합 (Example 2: Using OR to combine conditions)

color가 "red" 또는 "blue"인 모든 제품을 찾으려면:

filter = 'color == "red" OR color == "blue"'

예시 3: NOT으로 조건 제외 (Example 3: Using NOT to exclude a condition)

color가 "green"이 아닌 모든 제품을 찾으려면:

filter = 'NOT color == "green"'

IS NULL과 IS NOT NULL 연산자 (IS NULL and IS NOT NULL operators)

IS NULL과 IS NOT NULL 연산자는 특정 필드가 null 값(데이터 없음)을 포함하는지 여부를 기준으로 필터링하는 데 사용돼요.

  • IS NULL: 특정 필드가 null 값을 포함하는 엔티티를 식별해요. 즉 값이 없거나 정의되지 않았어요.
  • IS NOT NULL: 특정 필드가 null이 아닌 값을 포함하는 엔티티를 식별해요. 즉 필드에 유효하고 정의된 값이 있어요.

이 연산자는 대소문자를 구분하지 않아요. IS NULL 또는 is null, IS NOT NULL 또는 is not null을 사용할 수 있어요.

null 값을 가진 일반 스칼라 필드 (Regular scalar fields with null values)

Milvus는 null 값이 있는 일반 스칼라 필드(문자열, 숫자 등)에 대한 필터링을 허용해요.

VARCHAR 필드의 경우 빈 문자열 ""은 null 값으로 취급되지 않아요.

description 필드가 null인 엔티티를 검색하려면:

filter = 'description IS NULL'

description 필드가 null이 아닌 엔티티를 검색하려면:

filter = 'description IS NOT NULL'

description 필드가 null이 아니고 price 필드가 10보다 높은 엔티티를 검색하려면:

filter = 'description IS NOT NULL AND price > 10'

null 값을 가진 JSON 필드 (JSON fields with null values)

Milvus는 null 값을 포함하는 JSON 필드에 대한 필터링을 허용해요. JSON 필드는 다음과 같은 경우 null로 취급돼요.

  • 전체 JSON 객체가 명시적으로 None(null)으로 설정된 경우, 예: {"metadata": None}.
  • JSON 필드 자체가 엔티티에서 완전히 누락된 경우.

JSON 객체 내 일부 요소가 null이어도(예: 개별 키) 필드는 여전히 null이 아닌 것으로 간주돼요. 예를 들어 {"metadata": {"category": None, "price": 99.99}}는 category 키가 null이어도 null로 취급되지 않아요.

Milvus가 null 값이 있는 JSON 필드를 처리하는 방법을 더 설명하기 위해, metadata라는 JSON 필드가 있는 다음 샘플 데이터를 고려해 봐요.

data = [
  {
      "metadata": {"category": "electronics", "price": 99.99, "brand": "BrandA"},
      "pk": 1,
      "embedding": [0.12, 0.34, 0.56]
  },
  {
      "metadata": None, # Entire JSON object is null
      "pk": 2,
      "embedding": [0.56, 0.78, 0.90]
  },
  {  # JSON field `metadata` is completely missing
      "pk": 3,
      "embedding": [0.91, 0.18, 0.23]
  },
  {
      "metadata": {"category": None, "price": 99.99, "brand": "BrandA"}, # Individual key value is null
      "pk": 4,
      "embedding": [0.56, 0.38, 0.21]
  }
]

예시 1: metadata가 null인 엔티티 검색

metadata 필드가 누락되었거나 명시적으로 None으로 설정된 엔티티를 찾으려면:

filter = 'metadata IS NULL'

# Example output:
# data: [
#     "{'metadata': None, 'pk': 2}",
#     "{'metadata': None, 'pk': 3}"
# ]

예시 2: metadata가 null이 아닌 엔티티 검색

metadata 필드가 null이 아닌 엔티티를 찾으려면:

filter = 'metadata IS NOT NULL'

# Example output:
# data: [
#     "{'metadata': {'category': 'electronics', 'price': 99.99, 'brand': 'BrandA'}, 'pk': 1}",
#     "{'metadata': {'category': None, 'price': 99.99, 'brand': 'BrandA'}, 'pk': 4}"
# ]

null 값을 가진 ARRAY 필드 (ARRAY fields with null values)

Milvus는 null 값을 포함하는 ARRAY 필드에 대한 필터링을 허용해요. ARRAY 필드는 다음과 같은 경우 null로 취급돼요.

  • 전체 ARRAY 필드가 명시적으로 None(null)으로 설정된 경우, 예: "tags": None.
  • ARRAY 필드가 엔티티에서 완전히 누락된 경우.

ARRAY 필드의 모든 요소는 같은 데이터 타입이어야 하므로 ARRAY 필드는 부분 null 값을 포함할 수 없어요. 자세한 내용은 Array Field를 참고하세요.

Milvus가 null 값이 있는 ARRAY 필드를 처리하는 방법을 더 설명하기 위해, tags라는 ARRAY 필드가 있는 다음 샘플 데이터를 고려해 봐요.

data = [
  {
      "tags": ["pop", "rock", "classic"],
      "ratings": [5, 4, 3],
      "pk": 1,
      "embedding": [0.12, 0.34, 0.56]
  },
  {
      "tags": None,  # Entire ARRAY is null
      "ratings": [4, 5],
      "pk": 2,
      "embedding": [0.78, 0.91, 0.23]
  },
  {  # The tags field is completely missing
      "ratings": [9, 5],
      "pk": 3,
      "embedding": [0.18, 0.11, 0.23]
  }
]

예시 1: tags가 null인 엔티티 검색

tags 필드가 누락되었거나 명시적으로 None으로 설정된 엔티티를 검색하려면:

filter = 'tags IS NULL'

# Example output:
# data: [
#     "{'tags': None, 'ratings': [4, 5], 'embedding': [0.78, 0.91, 0.23], 'pk': 2}",
#     "{'tags': None, 'ratings': [9, 5], 'embedding': [0.18, 0.11, 0.23], 'pk': 3}"
# ]

예시 2: tags가 null이 아닌 엔티티 검색

tags 필드가 null이 아닌 엔티티를 검색하려면:

filter = 'tags IS NOT NULL'

# Example output:
# data: [
#     "{'metadata': {'category': 'electronics', 'price': 99.99, 'brand': 'BrandA'}, 'pk': 1}",
#     "{'metadata': {'category': None, 'price': 99.99, 'brand': 'BrandA'}, 'pk': 4}"
# ]

JSON 및 ARRAY 필드에서 기본 연산자 사용 팁 (Tips on using basic operators with JSON and ARRAY fields)

Milvus의 기본 연산자는 다재다능하며 스칼라 필드에 적용할 수 있지만, JSON 및 ARRAY 필드의 키와 인덱스에도 효과적으로 사용할 수 있어요.

예를 들어 price, model, tags 같은 여러 키를 포함하는 product 필드가 있다면 항상 키를 직접 참조해요.

filter = 'product["price"] > 1000'

기록된 온도 배열의 첫 번째 온도가 특정 값을 초과하는 레코드를 찾으려면 다음을 사용해요.

filter = 'history_temperatures[0] > 30'

결론 (Conclusion)

Milvus는 데이터를 필터링하고 쿼리하는 데 유연성을 주는 다양한 기본 연산자를 제공해요. 비교, 범위, 산술, 논리 연산자를 결합하면 검색 결과를 좁히고 필요한 데이터를 효율적으로 검색하는 강력한 필터 표현식을 만들 수 있어요.

FAQ

필터 조건의 매치 값 목록 길이에 제한이 있나요(예: filter='color in ["red", "green", "blue"]')? 목록이 너무 길면 어떻게 해야 하나요?

Zilliz Cloud는 필터 조건의 매치 값 목록 길이에 제한을 두지 않아요. 그러나 지나치게 긴 목록은 쿼리 성능에 큰 영향을 줄 수 있어요. 필터 조건에 긴 매치 값 목록이나 많은 요소가 있는 복잡한 표현식이 포함된 경우 Filter Templating을 사용해 쿼리 성능을 향상시키는 것을 권장해요.

더 알아보기 (Learn more)