diff --git a/src/main/java/com/ureca/uble/domain/users/repository/CustomUsageHistoryDocumentRepositoryImpl.java b/src/main/java/com/ureca/uble/domain/users/repository/CustomUsageHistoryDocumentRepositoryImpl.java index c69c25d..c90bc7c 100644 --- a/src/main/java/com/ureca/uble/domain/users/repository/CustomUsageHistoryDocumentRepositoryImpl.java +++ b/src/main/java/com/ureca/uble/domain/users/repository/CustomUsageHistoryDocumentRepositoryImpl.java @@ -49,6 +49,7 @@ public ElasticsearchAggregations getUsageDateAndDiffAndCount(User user) { // userId 필터 Query userFilter = getUserFilter(userId); + Query curMonthFilter = getCurMonthFilter(); // 사용자 성별, 연령대의 평균 사용량 정보 int userAgeRange = ((currentYear - user.getBirthDate().getYear() + 1) / 10) * 10; @@ -70,18 +71,29 @@ public ElasticsearchAggregations getUsageDateAndDiffAndCount(User user) { // 카테고리 순위 Aggregation categoryAggregation = Aggregation.of(a -> a - .terms(t -> t - .field("category") - .order(List.of(NamedValue.of("_count", SortOrder.Desc))) + .filter(f -> f + .bool(b -> b.filter(List.of(userFilter, curMonthFilter))) + ) + .aggregations("rank", subAgg -> subAgg + .terms(t -> t + .field("category") + .size(5) + .order(List.of(NamedValue.of("_count", SortOrder.Desc))) + ) ) ); // 제휴처 순위 Aggregation brandAggregation = Aggregation.of(a -> a - .terms(t -> t - .field("brandName") - .size(10) - .order(List.of(NamedValue.of("_count", SortOrder.Desc))) + .filter(f -> f + .bool(b -> b.filter(List.of(userFilter, curMonthFilter))) + ) + .aggregations("rank", subAgg -> subAgg + .terms(t -> t + .field("brandName") + .size(5) + .order(List.of(NamedValue.of("_count", SortOrder.Desc))) + ) ) ); @@ -465,4 +477,12 @@ private Query getUserRankFilter(User user) { )) )._toQuery(); } + + private Query getCurMonthFilter() { + return DateRangeQuery.of(r -> r + .field("createdAt") + .gte("now/M") + .lte("now") + )._toRangeQuery()._toQuery(); + } } diff --git a/src/main/java/com/ureca/uble/domain/users/service/UserService.java b/src/main/java/com/ureca/uble/domain/users/service/UserService.java index 827c13b..95b366f 100644 --- a/src/main/java/com/ureca/uble/domain/users/service/UserService.java +++ b/src/main/java/com/ureca/uble/domain/users/service/UserService.java @@ -17,7 +17,6 @@ import com.ureca.uble.entity.document.UsageHistoryDocument; import com.ureca.uble.global.exception.GlobalException; import lombok.RequiredArgsConstructor; - import org.slf4j.MDC; import org.springframework.data.elasticsearch.client.elc.ElasticsearchAggregations; import org.springframework.data.elasticsearch.core.SearchHits; @@ -214,14 +213,16 @@ public GetTimeRecommendationListRes getTimeRecommendation(Long userId) { private List getCategoryRankList(ElasticsearchAggregations rankResult) { return rankResult.aggregationsAsMap().get("category_rank").aggregation() - .getAggregate().sterms().buckets().array().stream() + .getAggregate().filter().aggregations() + .get("rank").sterms().buckets().array().stream() .map(b -> CategoryRankRes.of(b.key().stringValue(), b.docCount())) .toList(); } private List getBrandRankList(ElasticsearchAggregations rankResult) { return rankResult.aggregationsAsMap().get("brand_rank").aggregation() - .getAggregate().sterms().buckets().array().stream() + .getAggregate().filter().aggregations() + .get("rank").sterms().buckets().array().stream() .map(b -> BrandRankRes.of(b.key().stringValue(), b.docCount())) .toList(); }