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_APPENDupsert with field_ops기존 ARRAY 필드에 페이로드 요소를 추가합니다. Milvus v2.6.17 이상에서 사용할 수 있습니다.
ARRAY_REMOVEupsert 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를 참조하십시오.

번역DeepL

관리형 Milvus를 무료로 사용해 보세요

Zilliz Cloud는 번거로움이 없으며, Milvus 기반으로 10배 더 빠릅니다.

시작하기
피드백

이 페이지가 도움이 되었나요?