From 43eaafed1db328724d7e48638ca667a9fe237263 Mon Sep 17 00:00:00 2001 From: sungjindev Date: Wed, 14 Feb 2024 22:05:18 +0900 Subject: [PATCH] =?UTF-8?q?feat=20:=20=EA=B2=80=EC=83=89=EC=96=B4=20?= =?UTF-8?q?=EC=9E=90=EB=8F=99=20=EC=99=84=EC=84=B1=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=EA=B3=BC=20=EA=B4=80=EB=A0=A8=EB=90=9C=20=EC=84=9C=EB=B9=84?= =?UTF-8?q?=EC=8A=A4=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84=20(#95)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/store/application/StoreService.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/nainga/nainga/domain/store/application/StoreService.java b/src/main/java/com/nainga/nainga/domain/store/application/StoreService.java index 48661b8..be1f074 100644 --- a/src/main/java/com/nainga/nainga/domain/store/application/StoreService.java +++ b/src/main/java/com/nainga/nainga/domain/store/application/StoreService.java @@ -6,12 +6,14 @@ import com.nainga.nainga.global.application.RedisSortedSetService; import jakarta.annotation.PostConstruct; import lombok.RequiredArgsConstructor; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.HashSet; import java.util.List; +import java.util.Set; @Service @Transactional(readOnly = true) @@ -19,6 +21,8 @@ public class StoreService { private final StoreRepository storeRepository; private final RedisSortedSetService redisSortedSetService; + private String suffix = "*"; //검색어 자동 완성 기능에서 실제 노출될 수 있는 완벽한 형태의 단어를 구분하기 위한 접미사 + private int maxSize = 5; //검색어 자동 완성 기능 최대 개수 @PostConstruct public void init() { //이 Service Bean이 생성된 이후에 검색어 자동 완성 기능을 위한 데이터들을 Redis에 저장 (Redis는 인메모리 DB라 휘발성을 띄기 때문) @@ -27,7 +31,7 @@ public void init() { //이 Service Bean이 생성된 이후에 검색어 자 private void saveAllSubstring(List allDisplayName) { //MySQL DB에 저장된 모든 가게명을 음절 단위로 잘라 모든 Substring을 Redis에 저장해주는 로직 for (Store displayName : allDisplayName) { - redisSortedSetService.addToSortedSet(displayName.getDisplayName() + "*"); //완벽한 형태의 단어일 경우에는 *을 붙여 구분 + redisSortedSetService.addToSortedSet(displayName.getDisplayName() + suffix); //완벽한 형태의 단어일 경우에는 *을 붙여 구분 for (int i = displayName.getDisplayName().length()-1; i > 0; --i) { //음절 단위로 잘라서 모든 Substring 구하기 redisSortedSetService.addToSortedSet(displayName.getDisplayName().substring(0, i)); //곧바로 redis에 저장 @@ -42,6 +46,14 @@ public List autocorrect(String keyword) { //검색어 자동 완성 기 return new ArrayList<>(); //만약 사용자 검색어 바탕으로 자동 완성 검색어를 만들 수 없으면 Empty Array 리턴 } + Set allValuesAfterIndexFromSortedSet = redisSortedSetService.findAllValuesAfterIndexFromSortedSet(index); //사용자 검색어 이후로 정렬된 Redis 데이터들 가져오기 + List autocorrectKeywords = allValuesAfterIndexFromSortedSet.stream() + .filter(value -> value.endsWith(suffix) && value.startsWith(keyword)) + .map(value -> StringUtils.removeEnd(value, suffix)) + .limit(maxSize) + .toList(); //자동 완성을 통해 만들어진 최대 maxSize개의 키워드들 + + return autocorrectKeywords; } }