ARRAY 연산자
Milvus는 ARRAY 필드를 필터링하고 ARRAY 필드 값을 부분적으로 업데이트하기 위한 ARRAY 연산자를 제공합니다.
배열 내의 모든 요소는 동일한 유형이어야 하며, 배열 내의 중첩된 구조는 일반 문자열로 처리됩니다. 따라서 ARRAY 필드를 다룰 때는 지나치게 깊은 중첩을 피하고, 최적의 성능을 위해 데이터 구조를 가능한 한 평평하게 유지하는 것이 좋습니다.
Milvus의 ARRAY 연산자는 다음 두 가지 사용 시나리오를 다룹니다.
쿼리 및 검색을 위한 필터 표현식.
upsert요청에서의 부분 업데이트.
사용 가능한 ARRAY 연산자
다음 표는 Milvus에서 사용할 수 있는 ARRAY 연산자를 나열합니다.
| 연산자 | 사용처 | 설명 |
|---|---|---|
| ARRAY_CONTAINS(식별자, 식) | 필터 표현식 | ARRAY 필드에 특정 요소가 존재하는지 확인합니다. |
| ARRAY_CONTAINS_ALL(식별자, 식) | 필터 표현식 | 지정된 목록의 모든 요소가 ARRAY 필드에 존재하는지 확인합니다. |
| ARRAY_CONTAINS_ANY(식별자, 식) | 필터 표현식 | 지정된 목록의 요소 중 하나라도 ARRAY 필드에 존재하는지 확인합니다. |
| ARRAY_LENGTH(식별자) | 필터 표현식 | ARRAY 필드의 요소 수를 반환하며, 필터링을 위해 비교 연산자와 결합할 수 있습니다. |
| ARRAY_APPEND | upsert with field_ops | 기존 ARRAY 필드에 페이로드 요소를 추가합니다. Milvus v2.6.17 이상에서 사용할 수 있습니다. |
| ARRAY_REMOVE | upsert with field_ops | 요청 페이로드의 값과 일치하는 모든 요소를 기존 ARRAY 필드에서 제거합니다. Milvus v2.6.17 이상에서 사용할 수 있습니다. |
ARRAY_CONTAINS
ARRAY_CONTAINS 연산자는 배열 필드에 특정 요소가 존재하는지 확인합니다. 배열에 주어진 요소가 포함된 엔티티를 찾고자 할 때 유용합니다.
예시
history_temperatures 라는 배열 필드가 있으며, 이 필드에는 연도별 최저 기온 기록이 포함되어 있다고 가정해 보겠습니다. 배열에 23 값이 포함된 모든 엔티티를 찾으려면 다음 필터 표현식을 사용할 수 있습니다.
filter = 'ARRAY_CONTAINS(history_temperatures, 23)'
이렇게 하면 ` history_temperatures ` 배열에 ` 23` 값이 포함된 모든 엔티티가 반환됩니다.
ARRAY_CONTAINS_ALL
ARRAY_CONTAINS_ALL 연산자는 지정된 목록의 모든 요소가 배열 필드에 포함되어 있는지 확인합니다. 이 연산자는 배열에 여러 값이 포함된 엔티티를 일치시키려는 경우에 유용합니다.
예시
history_temperatures 배열에 23 과 24 이 모두 포함된 모든 엔티티를 찾으려면 다음을 사용할 수 있습니다.
filter = 'ARRAY_CONTAINS_ALL(history_temperatures, [23, 24])'
이렇게 하면 history_temperatures 배열에 지정된 두 값이 모두 포함된 모든 엔티티가 반환됩니다.
ARRAY_CONTAINS_ANY
ARRAY_CONTAINS_ANY 연산자는 지정된 목록의 요소 중 하나라도 배열 필드에 포함되어 있는지 확인합니다. 이 연산자는 배열에 지정된 값 중 적어도 하나를 포함하는 엔티티를 일치시키려는 경우에 유용합니다.
예시
history_temperatures 배열에 23 또는 24 중 하나가 포함된 모든 엔티티를 찾으려면 다음을 사용할 수 있습니다:
filter = 'ARRAY_CONTAINS_ANY(history_temperatures, [23, 24])'
이렇게 하면 history_temperatures 배열에 23 또는 24 중 적어도 하나의 값이 포함된 모든 엔티티가 반환됩니다.
ARRAY_LENGTH
ARRAY_LENGTH 는 배열 필드의 길이(요소 수)를 반환합니다. 이 함수는 배열 필드 식별자라는 정확히 하나의 매개변수만 받습니다.
예시
history_temperatures 배열의 요소 수가 10개 미만인 모든 엔티티를 찾으려면:
filter = 'ARRAY_LENGTH(history_temperatures) < 10'
이 쿼리는 ` history_temperatures ` 배열의 요소 수가 10개 미만인 모든 엔티티를 반환합니다.
ARRAY_APPENDCompatible with Milvus 2.6.17+
ARRAY_APPEND 연산자는 ` upsert ` 요청 중에 기존 ARRAY 필드에 페이로드 요소를 추가합니다. 이는 필터 표현식이 아닙니다. 현재 배열 값을 먼저 조회하지 않고 배열에 값을 추가하려는 경우 이 연산자를 사용하십시오.
다음 Python 예제는 기본 키가 1 인 엔티티의 tags ARRAY 필드에 "premium" 을 추가합니다:
from pymilvus import FieldOp, MilvusClient
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus"
)
client.upsert(
collection_name="users",
data=[{"pk": 1, "tags": ["premium"]}],
field_ops={"tags": FieldOp.array_append()},
)
field_ops 을 통해 필드에 ARRAY_APPEND 을 연결하면 해당 필드에 대해 부분 업데이트 세미언틱이 활성화됩니다. 전체 워크플로, 지원되는 요소 유형 및 제한 사항에 대해서는 병합 모드의 Upsert ARRAY 필드를 참조하십시오.
ARRAY_REMOVECompatible with Milvus 2.6.17+
ARRAY_REMOVE 연산자는 upsert 요청 중에 요청 페이로드의 값과 일치하는 기존 ARRAY 필드의 모든 요소를 제거합니다. 이는 필터 표현식이 아닙니다. 현재 배열 값을 먼저 쿼리하지 않고도 배열에서 일치하는 값을 제거하려는 경우 이 연산자를 사용하십시오.
다음 Python 예제는 기본 키가 1 인 엔티티의 tags ARRAY 필드에서 "trial" 를 제거합니다:
from pymilvus import FieldOp, MilvusClient
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus"
)
client.upsert(
collection_name="users",
data=[{"pk": 1, "tags": ["trial"]}],
field_ops={"tags": FieldOp.array_remove()},
)
field_ops 을 통해 ARRAY_REMOVE 을 필드에 연결하면 해당 필드에 대해 부분 업데이트(partial-update) 세미언틱이 활성화됩니다. 전체 워크플로, 지원되는 요소 유형 및 제한 사항에 대해서는 병합 모드에서 ARRAY 필드의 Upsert를 참조하십시오.