기본 연산자
Milvus는 데이터를 효율적으로 필터링하고 쿼리할 수 있도록 다양한 기본 연산자를 제공합니다. 이러한 연산자를 사용하면 스칼라 필드, 수치 계산, 논리 조건 등을 기반으로 검색 조건을 세밀하게 조정할 수 있습니다. 정확한 쿼리를 작성하고 검색 효율을 극대화하기 위해서는 이러한 연산자의 사용법을 이해하는 것이 매우 중요합니다.
비교 연산자
비교 연산자는 등가, 부등가 또는 크기 기준에 따라 데이터를 필터링하는 데 사용됩니다. 이 연산자들은 숫자형 및 텍스트형 필드에 적용할 수 있습니다.
지원되는 비교 연산자
==(같음)!=(불등호)>(보다 큼)<(보다 작음)>=(보다 크거나 같음)<=(작거나 같음)
예 1: '와 같음' 조건으로 필터링하기 (==)
status 라는 필드가 있고, status 가 "active"인 모든 엔티티를 찾고자 한다고 가정해 보겠습니다. 등호 연산자 == 를 사용할 수 있습니다:
filter = 'status == "active"'
예제 2: '!='에 대한 '아님' 조건으로 필터링하기
status 가 "inactive"가 아닌 엔티티를 찾으려면:
filter = 'status != "inactive"'
예 3: '보다 큼' 조건으로 필터링하기 (>)
age 값이 30보다 큰 모든 엔티티를 찾으려면:
filter = 'age > 30'
예 4: '보다 작음' 조건으로 필터링하기
price 값이 100보다 작은 엔티티를 찾으려면:
filter = 'price < 100'
예 5:>= 가 30보다 크거나 같은 값으로 필터링하기
rating 가 4 이상인 모든 엔티티를 찾으려면:
filter = 'rating >= 4'
예 6: ‘보다 작거나 같음’을 이용한 필터링
discount 가 10% 이하인 엔티티를 찾으려면:
filter = 'discount <= 10'
범위 연산자
범위 연산자는 특정 값 집합을 기준으로 데이터를 필터링하는 데 도움이 됩니다. Milvus는 집합 소속 여부를 확인하기 위해 IN 를 지원합니다.
color 가 "red", "green" 또는 "blue"인 모든 엔티티를 찾으려면:
filter = 'color in ["red", "green", "blue"]'
이는 값 목록에 속하는지 여부를 확인할 때 유용합니다.
패턴 매칭 연산자
패턴 일치 연산자는 와일드카드 패턴이나 정규식을 기반으로 문자열 값을 필터링하는 데 도움이 됩니다.
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) 중 선택 방법, 지원되는 필드 유형, 정규 표현식 구문, 이스케이프 규칙 및 성능에 대한 자세한 내용은 ‘패턴 매칭’을 참조하십시오. 또한 Milvus에서는 VARCHAR 필드나 JSON 문자열 경로에 NGRAM 인덱스를 생성하여 해당 패턴 매칭 필터의 성능을 향상시킬 수 있습니다. 자세한 내용은 ‘NGRAM’을 참조하십시오.
산술 연산자
산술 연산자를 사용하면 숫자 필드를 포함한 계산을 기반으로 조건을 생성할 수 있습니다.
지원되는 산술 연산자
+(덧셈)-(뺄셈)*(곱셈)/(나눗셈)%(모듈로 연산)**(제곱)
예제 1: 나머지 연산 사용 (%)
id 가 짝수(즉, 2로 나누어 떨어지는 수)인 원소를 구하려면:
filter = 'id % 2 == 0'
예제 2: 지수 연산 활용 (**)
price 의 2제곱이 1000보다 큰 개체를 찾으려면:
filter = 'price ** 2 > 1000'
비트 연산자Compatible with Milvus 3.0.0+
비트 연산자는 정수 필드가 권한, 기능 플래그 또는 상태 비트와 같은 여러 플래그를 인코딩할 때 유용합니다. 필터 표현식에서 이러한 연산자를 사용하여 정수 값의 개별 비트를 확인, 결합 또는 비교할 수 있습니다.
스칼라 필드의 경우, 비트 연산자는 INT8, INT16, INT32, INT64 와 같은 정수 필드 유형에 적용됩니다.
지원되는 비트 단위 연산자
| 연산자 | 이름 | 일반적인 용도 |
|---|---|---|
& | 비트별 AND | 특정 비트가 설정되어 있는지 확인합니다. |
| | 비트별 OR | 비트를 결합한 후 비교합니다. |
^ | 비트별 XOR | 두 값 간의 비트 차이를 비교합니다. |
예: 권한 비트를 이용한 필터링
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(~) 및 시프트 연산자(<< 및 >>)는 지원되지 않습니다.
논리 연산자
논리 연산자는 여러 조건을 결합하여 더 복잡한 필터 표현식을 만드는 데 사용됩니다. 여기에는 AND, OR 및 NOT 가 포함됩니다.
지원되는 논리 연산자
AND: 여러 조건이 모두 참이어야 하는 경우를 결합합니다.OR: 조건 중 적어도 하나가 참이어야 하는 경우를 결합합니다.NOT: 조건을 부정합니다.
예 1: ` AND `을 사용하여 조건 결합하기
price 가 100보다 크고 stock 가 50보다 큰 모든 제품을 찾으려면:
filter = 'price > 100 AND stock > 50'
예 2: ‘ OR ’를 사용하여 조건 결합하기
color 가 “red”이거나 “blue”인 모든 상품을 찾으려면:
filter = 'color == "red" OR color == "blue"'
예 3: NOT 를 사용하여 조건 제외하기
color 가 “green”이 아닌 모든 상품을 찾으려면:
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 객체가 명시적으로 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: 메타데이터가 null인 엔티티 검색
metadata 필드가 없거나 명시적으로 None으로 설정된 엔티티를 찾으려면:
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 값을 가진 ARRAY 필드
Milvus에서는 null 값을 포함하는 ARRAY 필드를 기준으로 필터링할 수 있습니다. ARRAY 필드는 다음과 같은 경우 null로 간주됩니다:
ARRAY 필드 전체가 명시적으로 None(null)으로 설정된 경우(예:
"tags": None).엔티티에서 ARRAY 필드가 완전히 누락된 경우.
ARRAY 필드의 모든 요소는 동일한 데이터 유형을 가져야 하므로, ARRAY 필드에는 부분적인 null 값이 포함될 수 없습니다. 자세한 내용은 'Array Field'를 참조하십시오.
Milvus가 null 값이 포함된 ARRAY 필드를 어떻게 처리하는지 더 자세히 설명하기 위해, ARRAY 필드 tags 가 포함된 다음 샘플 데이터를 살펴보겠습니다:
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 필드에서 기본 연산자 사용 팁
Milvus의 기본 연산자는 다용도로 사용 가능하며 스칼라 필드에 적용할 수 있을 뿐만 아니라, JSON 및 ARRAY 필드의 키와 인덱스와 함께 효과적으로 사용할 수도 있습니다.
예를 들어, product 필드에 price, model, tags 와 같은 여러 키가 포함되어 있는 경우, 항상 키를 직접 참조해야 합니다:
filter = 'product["price"] > 1000'
기록된 온도 배열에서 첫 번째 온도가 특정 값을 초과하는 레코드를 찾으려면 다음을 사용하십시오:
filter = 'history_temperatures[0] > 30'
결론
Milvus는 데이터 필터링 및 쿼리 시 유연성을 제공하는 다양한 기본 연산자를 제공합니다. 비교, 범위, 산술 및 논리 연산자를 조합하여 강력한 필터 표현식을 생성하면 검색 결과를 좁혀 필요한 데이터를 효율적으로 가져올 수 있습니다.
자주 묻는 질문
필터 조건에서 일치 값 목록의 길이에 제한이 있습니까(예: filter=’color in ["red", "green", “blue”]')? 목록이 너무 길면 어떻게 해야 합니까?
Zilliz Cloud는 필터 조건의 일치 값 목록에 길이 제한을 두지 않습니다. 그러나 목록이 지나치게 길면 쿼리 성능에 상당한 영향을 미칠 수 있습니다. 필터 조건에 긴 일치 값 목록이나 요소가 많은 복잡한 표현식이 포함된 경우, 쿼리 성능을 향상시키기 위해 필터 템플릿을 사용하는 것을 권장합니다.