집계

집계 (Aggregate)

"이 컬렉션에 몇 개가 있지?", "text 프로퍼티에서 가장 자주 나온 값은?", "int 프로퍼티의 합·평균·최대·최소는?" 이런 계산이 필요할 때 Aggregate 쿼리를 씁니다. 검색 결과 집합 자체를 처리해 집계된 값을 돌려주는 쿼리예요. 전체 객체 그룹 또는 전체 결과 집합을 대상으로 동작합니다.

Aggregate 쿼리를 실행하려면 다음을 지정해야 해요.

  • 검색할 대상 컬렉션
  • 하나 이상의 집계 대상 프로퍼티(메타 프로퍼티, 객체 프로퍼티, groupedBy 프로퍼티)
  • 각 선택 프로퍼티에 대해 최소 하나의 서브 프로퍼티 선택

출처: 공식문서

count 메타 프로퍼티 조회

쿼리에 매칭된 객체 수를 반환합니다.

jeopardy = client.collections.use("JeopardyQuestion")
response = jeopardy.aggregate.over_all(total_count=True)
print(response.total_count)

text 프로퍼티 집계

이 예시는 출현 빈도를 집계합니다. 가장 많이 등장한 값의 개수와 값을 보고, 최소 출현 횟수 임계값을 둘 수 있어요.

from weaviate.classes.query import Metrics

jeopardy = client.collections.use("JeopardyQuestion")
response = jeopardy.aggregate.over_all(
    return_metrics=Metrics("answer").text(
        top_occurrences_count=True,
        top_occurrences_value=True,
        min_occurrences=5  # 최소 출현 횟수 임계값
    )
)
print(response.properties["answer"].top_occurrences)

int 프로퍼티 집계

정수 집계입니다. (float, 즉 NUMBER 타입이면 .number를 사용하세요.)

from weaviate.classes.query import Metrics

response = jeopardy.aggregate.over_all(
    return_metrics=Metrics("points").integer(sum_=True, maximum=True, minimum=True),
)
print(response.properties["points"].sum_)
print(response.properties["points"].minimum)
print(response.properties["points"].maximum)

groupedBy 프로퍼티 집계

결과를 그룹으로 나누려면 쿼리에서 groupBy를 사용하고, 그룹별 집계 데이터를 가져오려면 groupedBy 프로퍼티를 씁니다.

from weaviate.classes.aggregate import GroupByAggregate

response = jeopardy.aggregate.over_all(
    group_by=GroupByAggregate(prop="round")
)
for group in response.groups:
    print(f"Value: {group.grouped_by.value} Count: {group.total_count}")

similarity search와 함께 집계

Aggregate유사도 검색 연산자(즉 Near 연산자)와 함께 쓸 수 있어요. 집계할 최대 객체 수를 정하려면 objectLimit을 사용합니다.

from weaviate.classes.query import Metrics

response = jeopardy.aggregate.near_text(
    query="animals in space",
    object_limit=10,
    return_metrics=Metrics("points").number(sum_=True),
)

유사도 distance 설정

객체가 얼마나 유사해야 할지 distance로 지정합니다.

response = jeopardy.aggregate.near_text(
    query="animals in space",
    distance=0.19,
    return_metrics=Metrics("points").number(sum_=True),
)

hybrid search와 함께 집계

Aggregate하이브리드 검색 연산자와도 함께 쓸 수 있어요.

from weaviate.classes.query import Metrics, BM25Operator

response = jeopardy.aggregate.hybrid(
    query="animals in space",
    bm25_operator=BM25Operator.and_(),  # bm25_operator, filter 등 추가 파라미터 가능
    object_limit=10,
    return_metrics=Metrics("points").number(sum_=True),
)

결과 필터링

더 구체적인 결과를 위해 filter로 검색을 좁힙니다.

from weaviate.classes.query import Filter

response = jeopardy.aggregate.over_all(
    filters=Filter.by_property("round").equal("Final Jeopardy!"),
)
print(response.total_count)

더 알아보기 (Learn more)