# Esframework 조회 메서드 목록 | 메서드 | recent 여부 | 설명 | |--------|------------|------| | `findHits` | | SimpleQuery 조건에 맞는 모든 문서를 찾는다. | | `findAllHits` | | **조건 없이** 인덱스 전체를 조회할 때 사용한다. (최대 1만건) | | `findRecentHits` | ✅ | SimpleQuery 조건에 맞는 문서들 중 `recent=true`인 문서들만 찾는다. | | `findDocById` | | 문서의 id로 문서 단건 조회 | | `findRecentDocByRecentId` | ✅ | 문서의 `recent_id`로 `recent=true`인 문서 단건 조회 | ```java SearchDocDTO searchDocDTO = SimpleQuery.termQueryFilter(recentIdFieldName, u) .andTermQueryFilter(recentFieldName, true) .toSearchDoc(); ``` | 메서드 | recent 여부 | 설명 | |--------|------------|------| | `aggregate` | | SimpleQuery 조건에 맞는 문서들을 `mainField`, `subField` 기준으로 group by | | `aggregateRecent` | ✅ | `recent=true` 문서들만 group by | | `aggregateByWeek` | | 주 단위로 group by | | `aggregateRecentByWeek` | ✅ | `recent=true` 문서들만 주 단위 group by | - `mainField` 기준으로 OpenSearch `date_histogram` 집계 수행 - 1주 단위 버킷 생성 - `.minDocCount(0)` 설정으로 **빈 주도 0으로 표시** | 메서드 | recent 여부 | 설명 | |--------|------------|------| | `aggregateCardinalityByDay` | | 날짜별 특정 필드의 **고유값 수 (중복 제거 카운트)** 집계 | - 구조: `date_histogram(mainField)` + `cardinality(subField)` - 리스트가 아닌 단일 DTO 사용 | 메서드 | recent 여부 | 설명 | |--------|------------|------| | `findAllRecentDocsBySearchAfter` | ✅ | `search_after` 방식으로 전체 문서 반복 수집 | | `compositeHits` | | composite aggregation 단일 페이지 조회 | | `compositeAllHits` | | `afterKey`가 null일 때까지 전체 페이지 순회 | | `compositeRecentAllHits` | ✅ | `recent=true` 포함 전체 순회 | | `compositeAggregationRecent` | ✅ | `recent=true` composite 결과 단일 페이지 반환 | # 사용할 메서드 분류 ## 단일 인덱스 조회 (recent 없음) - `findHits` - `findAllHits` - `findDocById` ## rolling 인덱스 조회 (recent 기반) - `findRecentDocByRecentId` - `findHits` - `findRecentHits` ## 집계 (Aggregation) ### 일반 aggregation (terms) - 데이터 개수가 적을 때 - Top N 조회 ### composite aggregation - 전체 데이터 집계 필요 - 정확한 순회 필요 - cursor 기반 처리 (`after_key`) ## 주의 일반 aggregation으로 전체 데이터를 가져오려면 size를 크게 늘려야 하며, 이는 OpenSearch 메모리에 부담을 준다. → composite aggregation 사용 권장 # Composite Aggregation (복합 집계) ## 정의 서로 다른 소스에서 복합 버킷을 생성하는 다중 버킷 집계 - terms aggregation과 달리 페이지네이션 가능 - `after_key` 기반 순회 ## 사용 케이스 - 데이터가 많아서 terms로 처리 불가 - 정확한 통계 필요 - 전체 데이터 집계 필요 - 배치 작업 # 비교 | 항목 | terms aggregation | composite aggregation | |------|------------------|----------------------| | 목적 | Top N 조회 | 전체 bucket 순회 | | 정렬 | doc_count 기준 | key 기준 | | 페이지네이션 | ❌ 불가능 | ✅ 가능 (`after_key`) | | 정확성 | ❌ 일부 누락 가능 | ✅ 전체 조회 | | 성능 | 빠름 (Top만) | 안정적 (전체 순회) | | 다중 필드 | 제한적 | 매우 강력 (GROUP BY 여러 개) |