기본 연산자
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 NULL 및 IS 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"]')? 목록이 너무 길면 어떻게 해야 하나요?
질리즈 클라우드는 필터 조건의 일치 값 목록에 길이 제한을 두지 않습니다. 하지만 지나치게 긴 목록은 쿼리 성능에 큰 영향을 줄 수 있습니다. 필터 조건에 일치 값 목록이 길거나 요소가 많은 복잡한 표현식이 포함된 경우 필터 템플릿을 사용하여 쿼리 성능을 개선하는 것이 좋습니다.