기본 연산자

Milvus는 데이터를 효율적으로 필터링하고 쿼리하는 데 도움이 되는 다양한 기본 연산자 세트를 제공합니다. 이러한 연산자를 사용하면 스칼라 필드, 숫자 계산, 논리적 조건 등을 기반으로 검색 조건을 구체화할 수 있습니다. 이러한 연산자를 사용하는 방법을 이해하는 것은 정확한 쿼리를 작성하고 검색의 효율성을 극대화하는 데 매우 중요합니다.

비교 연산자

비교 연산자는 같음, 같지 않음 또는 크기에 따라 데이터를 필터링하는 데 사용됩니다. 숫자 및 텍스트 필드에 적용할 수 있습니다.

지원되는 비교 연산자

  • == (같음)

  • != (같지 않음)

  • > (보다 큼)

  • < (보다 작음)

  • >= (보다 크거나 같음)

  • <= (다음보다 작거나 같음)

예 1: 같음(==)으로 필터링

status 이라는 필드가 있고 status 이 "활성"인 모든 엔터티를 찾고자 한다고 가정합니다. 같음 연산자 == 를 사용할 수 있습니다:

filter = 'status == "active"'

예 2: 같지 않음 (!=)으로 필터링하기

status 이 "비활성"이 아닌 엔터티를 찾으려는 경우:

filter = 'status != "inactive"'

예 3: Greater Than (>)으로 필터링하기

age 이 30보다 큰 모든 엔터티를 찾으려는 경우:

filter = 'age > 30'

예 4: 다음을 사용하여 필터링

price 이 100 미만인 엔터티를 찾으려면 다음과 같이 하세요:

filter = 'price < 100'

예 5: 보다 크거나 같음(>=)으로 필터링하기

rating 이 4보다 크거나 같은 모든 엔터티를 찾으려는 경우:

filter = 'rating >= 4'

예 6: 다음보다 작거나 같음으로 필터링

discount 가 10% 이하인 엔티티를 찾으려면 다음과 같이 합니다:

filter = 'discount <= 10'

범위 연산자

범위 연산자는 특정 집합 또는 값 범위를 기준으로 데이터를 필터링하는 데 도움이 됩니다.

지원되는 범위 연산자

  • IN: 특정 집합 또는 범위 내의 값을 일치시키는 데 사용됩니다.

  • LIKE: 패턴을 일치시키는 데 사용됩니다(주로 텍스트 필드에 사용). Milvus를 사용하면 VARCHAR 또는 JSON 필드에 NGRAM 인덱스를 구축하여 텍스트 쿼리를 가속화할 수 있습니다. 자세한 내용은 NGRAM을 참조하세요.

예 1: IN 을 사용하여 여러 값 일치시키기

color 이 "빨간색", "녹색" 또는 "파란색"인 모든 엔티티를 찾고자 하는 경우:

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

이 방법은 값 목록의 멤버십을 확인하려는 경우에 유용합니다.

예 2: 패턴 일치에 LIKE 사용

LIKE 연산자는 문자열 필드에서 패턴 일치에 사용됩니다. 이 연산자는 텍스트 내에서 접두사, 접두사 또는 접미사 등 다양한 위치의 하위 문자열을 일치시킬 수 있습니다. LIKE 연산자는 % 기호를 와일드카드로 사용하며, 0을 포함하여 원하는 수의 문자와 일치시킬 수 있습니다.

대부분의 경우 접두사 또는 접미사 일치는 접두사 일치보다 훨씬 느립니다. 성능이 중요한 경우에는 주의해서 사용하세요.

접두사 일치(다음으로 시작)

문자열이 지정된 패턴으로 시작하는 접두사 일치를 수행하려면 패턴을 처음에 배치하고 % 을 사용하여 그 뒤에 오는 모든 문자를 일치시킬 수 있습니다. 예를 들어 name 가 "Prod"로 시작하는 모든 제품을 찾으려면:

filter = 'name LIKE "Prod%"'

이렇게 하면 "제품 A", "제품 B" 등과 같이 이름이 "Prod"로 시작하는 모든 제품이 일치합니다.

접미사 일치(끝으로 끝남)

문자열이 지정된 패턴으로 끝나는 접미사 일치의 경우, 패턴의 시작 부분에 % 기호를 배치합니다. 예를 들어 name 이 "XYZ"로 끝나는 모든 제품을 찾으려면:

filter = 'name LIKE "%XYZ"'

이렇게 하면 이름이 "XYZ"로 끝나는 모든 제품(예: "ProductXYZ", "SampleXYZ" 등)이 일치합니다.

접두사 일치(포함)

문자열의 어느 위치에나 패턴이 나타날 수 있는 접두사 일치를 수행하려면 패턴의 시작과 끝 모두에 % 기호를 배치하면 됩니다. 예를 들어 name 에 "Pro"라는 단어가 포함된 모든 제품을 찾습니다:

filter = 'name LIKE "%Pro%"'

이렇게 하면 이름에 "Pro"가 포함된 모든 제품(예: "Product", "ProLine" 또는 "SuperPro")이 일치합니다.

산술 연산자

산술 연산자를 사용하면 숫자 필드와 관련된 계산을 기반으로 조건을 생성할 수 있습니다.

지원되는 산술 연산자:

  • + (더하기)

  • - (빼기)

  • * (곱셈)

  • / (나누기)

  • % (모듈러스)

  • ** (지수)

예 1: 모듈러스 사용(%)

id 가 짝수(즉, 2로 나눌 수 있는)인 엔티티를 찾습니다:

filter = 'id % 2 == 0'

예 2: 지수 사용 (**)

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

filter = 'price ** 2 > 1000'

논리 연산자

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

지원되는 논리 연산자

  • AND: 모두 참이어야 하는 여러 조건을 결합합니다.

  • OR: 하나 이상의 조건이 참이어야 하는 조건을 결합합니다.

  • NOT: 조건을 무효화합니다.

예 1: AND 사용하여 조건 결합하기

price 가 100보다 크고 stock 가 50보다 큰 모든 제품을 찾습니다:

filter = 'price > 100 AND stock > 50'

예 2: OR 사용하여 조건 결합하기

color 이 "빨간색" 또는 "파란색"인 모든 제품을 찾으려면:

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

예 3: NOT 사용하여 조건 제외하기

color 이 "녹색"이 아닌 모든 제품을 찾으려면:

filter = 'NOT color == "green"'

IS NULL 및 IS NOT NULL 연산자

IS NULLIS NOT NULL 연산자는 null 값(데이터 부재) 포함 여부에 따라 필드를 필터링하는 데 사용됩니다.

  • IS NULL: 특정 필드에 null 값이 포함된 엔터티, 즉 값이 없거나 정의되지 않은 엔터티를 식별합니다.

  • IS NOT NULL: 특정 필드에 null 이외의 값이 포함된 엔터티, 즉 필드에 유효한 정의된 값이 있는 엔터티를 식별합니다.

연산자는 대소문자를 구분하지 않으므로 IS NULL 또는 is null, IS NOT NULL 또는 is not null 을 사용할 수 있습니다.

Null 값이 있는 일반 스칼라 필드

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 필드

Milvus에서는 null 값이 포함된 JSON 필드에 대한 필터링이 가능합니다. JSON 필드는 다음과 같은 방식으로 null로 처리됩니다:

  • 전체 JSON 객체가 명시적으로 없음(null)으로 설정된 경우(예: {"metadata": None}).

  • JSON 필드 자체가 엔티티에서 완전히 누락된 경우.

JSON 객체 내의 일부 요소(예: 개별 키)가 널인 경우에도 해당 필드는 여전히 널이 아닌 것으로 간주됩니다. 예를 들어 category 키가 널이더라도 \{"metadata": \{"category": None, "price": 99.99}} 은 널로 취급되지 않습니다.

Milvus가 null 값이 있는 JSON 필드를 처리하는 방법을 더 자세히 설명하기 위해 다음 샘플 데이터 metadata 를 예로 들어 보겠습니다:

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: 메타데이터가 null인 엔티티 검색하기

metadata 필드가 누락되었거나 명시적으로 없음으로 설정된 엔티티를 찾습니다:

filter = 'metadata IS NULL'

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

예 2: 메타데이터가 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 값이 있는 필드 배열하기

Milvus에서는 null 값이 포함된 ARRAY 필드에 대한 필터링이 가능합니다. ARRAY 필드는 다음과 같은 방식으로 null로 처리됩니다:

  • 전체 ARRAY 필드가 명시적으로 없음(null)으로 설정된 경우(예: "tags": None).

  • ARRAY 필드가 엔티티에서 완전히 누락된 경우.

배열 필드의 모든 요소는 동일한 데이터 유형을 가져야 하므로 배열 필드에는 부분적으로 null 값을 포함할 수 없습니다. 자세한 내용은 배열 필드를 참조하십시오.

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: 태그가 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: 태그가 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 및 배열 필드에서 기본 연산자 사용에 대한 팁

Milvus의 기본 연산자는 다목적이며 스칼라 필드에도 적용될 수 있지만, JSON 및 ARRAY 필드의 키와 인덱스에도 효과적으로 사용할 수 있습니다.

예를 들어 price, model, tags 과 같은 여러 개의 키가 포함된 product 필드가 있는 경우 항상 키를 직접 참조하세요:

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

기록된 온도 배열에서 첫 번째 온도가 특정 값을 초과하는 기록을 찾으려면 다음을 사용합니다:

filter = 'history_temperatures[0] > 30'

결론

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

FAQ

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

질리즈 클라우드는 필터 조건의 일치 값 목록에 길이 제한을 두지 않습니다. 하지만 지나치게 긴 목록은 쿼리 성능에 큰 영향을 줄 수 있습니다. 필터 조건에 일치 값 목록이 길거나 요소가 많은 복잡한 표현식이 포함된 경우 필터 템플릿을 사용하여 쿼리 성능을 개선하는 것이 좋습니다.