기본 연산자 (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)
- Pattern Matching — 패턴 매칭
- NGRAM — NGRAM 인덱스
- Filter Templating — 필터 템플릿팅
- Array Field — 배열 필드
- Milvus 공식 문서 — 검색·쿼리 관련 자료