조건부 쿼리

이 주제에서는 조건부 쿼리를 수행하는 방법을 소개합니다.

벡터의 유사성 검색과 달리 조건부 쿼리는 부울 표현식을 통해 스칼라 필터를 사용하여 벡터를 검색합니다. Milvus는 스칼라 필드 및 다양한 부울 표현식에 대한 쿼리를 지원합니다. 부울 표현식은 스칼라 필드 또는 기본 키 필드를 필터링하는 데 사용될 수 있으며 필터링 조건과 일치하는 모든 결과를 검색합니다.

다음 예제는 책 2000행의 데이터셋을 쿼리하는 방법을 보여줍니다. 이 데이터셋에는 책 ID(기본 키), 단어 수(스칼라 필드) 및 책 소개(벡터 필드)가 포함되어 있으며, 책 ID를 기반으로 특정 책을 쿼리하는 시나리오를 시뮬레이션합니다.

컬렉션 로드

쿼리를 수행하기 전에 컬렉션을 메모리에 로드해야 합니다.

from pymilvus import Collection
collection = Collection("book")      # 기존 컬렉션을 가져옵니다.
collection.load()

쿼리 실행

다음 예제는 특정 book_id 값 기반의 필터링된 벡터를 반환하고 결과에서 book_id 필드와 book_intro 필드를 반환합니다.

Milvus는 쿼리를 위한 일관성 수준 설정을 지원합니다. 이 주제의 예제는 일관성 수준을 강함으로 설정합니다. 또한 제한된, 세션, 또는 최종적으로 일관성 수준으로 설정할 수 있습니다. Milvus의 네 가지 일관성 수준에 대한 자세한 내용은 일관성을 참조하세요.

필터 표현식에서 동적 필드를 사용하고 쿼리 요청에서 출력 필드를 지정할 수도 있습니다. 예를 들어 동적 스키마를 참조하세요.

res = collection.query(
  expr = "book_id in [2,4,6,8]",
  offset = 0,
  limit = 10, 
  output_fields = ["book_id", "book_intro"],
)
매개변수 설명
expr 속성을 필터링하는 데 사용되는 부울 표현식입니다. 부울 표현식 규칙에 대한 자세한 내용은 부울 표현식 규칙을 참조하세요.
limit 반환할 가장 유사한 결과의 수입니다. 이 값과 offset의 합은 16384보다 작아야 합니다.
offset 컬렉션에서 건너뛸 결과의 수입니다. limit이 지정된 경우에만 사용 가능하며, 이 값과 limit의 합은 16384보다 작아야 합니다. 예를 들어, 벡터의 9번째와 10번째 최근 이웃을 쿼리하려면 limit2로 설정하고 offset8로 설정합니다.
output_fields (선택 사항) 반환할 필드 이름의 목록입니다.
partition_names (선택 사항) 쿼리할 파티션 이름의 목록입니다.
consistency_level (선택 사항) 쿼리에 대한 일관성 수준입니다.

결과를 확인하세요.

sorted_res = sorted(res, key=lambda k: k['book_id'])
sorted_res

엔티티 수 세기

쿼리를 수행할 때 count(*)output_fields에 추가하여 Milvus가 컬렉션에 있는 엔티티의 수를 반환할 수 있습니다. 특정 조건을 충족하는 엔티티 수를 세고 싶다면 expr을 사용하여 부울 표현식을 정의하세요.

컬렉션에 있는 모든 엔티티를 세기:

res = collection.query(
  expr="", 
  output_fields = ["count(*)"],
)

print(res)
print(res[0])

특정 필터링 조건을 충족하는 엔티티 수를 세기:

res = collection.query(
  expr="book_id in [2,4,6,8]", 
  output_fields = ["count(*)"],
)

print(res)
print(res[0])

제한 사항

output_fields에서 count(*)을 사용할 때 limit 매개변수의 사용이 금지됩니다.