Skip to content

Commit 46d2151

Browse files
Merge pull request #146 from IT-Cotato/fix/145
[Fix] 대체검색어 오류 수정
2 parents e491e57 + c169cff commit 46d2151

File tree

2 files changed

+30
-12
lines changed

2 files changed

+30
-12
lines changed

build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,9 @@ dependencies {
7575

7676
// AWS S3
7777
implementation 'io.awspring.cloud:spring-cloud-aws-starter-s3:3.2.1'
78+
79+
// 대체 검색어 유사도 계산
80+
implementation 'org.apache.commons:commons-text:1.12.0'
7881
}
7982

8083
dependencyManagement {

src/main/java/com/ongil/backend/domain/search/service/SearchService.java

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,12 @@
1919

2020
import java.time.LocalDateTime;
2121
import java.util.ArrayList;
22+
import java.util.Comparator;
2223
import java.util.LinkedHashSet;
2324
import java.util.List;
2425
import java.util.UUID;
2526
import java.util.stream.Collectors;
27+
import org.apache.commons.text.similarity.LevenshteinDistance;
2628

2729
import co.elastic.clients.elasticsearch._types.aggregations.StringTermsAggregate;
2830
import lombok.extern.slf4j.Slf4j;
@@ -67,25 +69,38 @@ public SearchResDto search(String query, Long userId) {
6769
return SearchResDto.of(List.of(), alternatives);
6870
}
6971

70-
public List<String> recommendAlternatives(String keyword, int limit) {
72+
public List<String> recommendAlternatives(String keyword, int size) {
7173
NativeQuery nativeQuery = NativeQuery.builder()
72-
.withQuery(q -> q.fuzzy(f -> f
73-
.field("keyword")
74-
.value(keyword)
75-
.fuzziness("2")
76-
.prefixLength(1)
74+
.withQuery(q -> q.bool(b -> b
75+
.should(s -> s.match(m -> m.field("brandName.autocomplete").query(keyword)))
76+
.should(s -> s.match(m -> m.field("categoryName.autocomplete").query(keyword)))
77+
.should(s -> s.match(m -> m.field("name.autocomplete").query(keyword)))
7778
))
78-
.withMinScore(0.1f)
79-
.withMaxResults(limit * 2)
79+
.withMaxResults(50)
8080
.build();
8181

82-
SearchHits<SearchLogDocument> hits = elasticsearchOperations.search(nativeQuery, SearchLogDocument.class);
82+
SearchHits<ProductDocument> hits =
83+
elasticsearchOperations.search(nativeQuery, ProductDocument.class);
84+
85+
LevenshteinDistance levenshtein = new LevenshteinDistance();
86+
String lowerKeyword = keyword.toLowerCase();
8387

8488
return hits.getSearchHits().stream()
85-
.map(hit -> hit.getContent().getKeyword())
86-
.filter(k -> !k.equals(keyword))
89+
.map(hit -> {
90+
ProductDocument doc = hit.getContent();
91+
List<String> candidates = new ArrayList<>();
92+
if (doc.getBrandName() != null) candidates.add(doc.getBrandName());
93+
if (doc.getCategoryName() != null) candidates.add(doc.getCategoryName());
94+
if (doc.getName() != null) candidates.add(doc.getName());
95+
return candidates;
96+
})
97+
.flatMap(List::stream)
8798
.distinct()
88-
.limit(limit)
99+
.sorted(Comparator.comparingInt(val ->
100+
levenshtein.apply(lowerKeyword, val.toLowerCase())
101+
))
102+
.filter(val -> !val.equalsIgnoreCase(keyword))
103+
.limit(size)
89104
.toList();
90105
}
91106

0 commit comments

Comments
 (0)