집계
집계 (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)