Skip to content

Commit

Permalink
feat: #101 자동완성 구현
Browse files Browse the repository at this point in the history
  • Loading branch information
PARKJONGGYEONG committed May 9, 2024
1 parent edddc6a commit 7abd632
Show file tree
Hide file tree
Showing 3 changed files with 79 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.t3t.bookstoreapi.elastic.controller;

import com.t3t.bookstoreapi.elastic.service.AutocompleteService;
import com.t3t.bookstoreapi.model.response.BaseResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;
import java.util.List;

@RestController
@RequiredArgsConstructor
public class AutocompleteController {

private final AutocompleteService autocompleteService;
@GetMapping("/autocomplete")
public ResponseEntity<BaseResponse<List<String>>> autocomplete(@RequestParam String prefix) throws IOException {
BaseResponse<List<String>> autocomplete = autocompleteService.autocomplete(prefix);
return ResponseEntity.ok().body(autocomplete);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package com.t3t.bookstoreapi.elastic.service;

import com.t3t.bookstoreapi.model.response.BaseResponse;
import lombok.RequiredArgsConstructor;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.suggest.SuggestBuilder;
import org.elasticsearch.search.suggest.SuggestBuilders;
import org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.util.List;
import java.util.stream.Collectors;

@Service
@RequiredArgsConstructor
public class AutocompleteService {

private final RestHighLevelClient client;
public BaseResponse<List<String>> autocomplete(String prefix) throws IOException {

SearchRequest searchRequest = new SearchRequest("t3t_book"); // Elasticsearch 인덱스 이름
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

CompletionSuggestionBuilder completionSuggestionBuilder =
SuggestBuilders.completionSuggestion("book_name.book_name2") // 자동완성 필드 설정
.prefix(prefix)
.size(10);

searchSourceBuilder.suggest(new SuggestBuilder().addSuggestion("suggest_book_name", completionSuggestionBuilder));
searchRequest.source(searchSourceBuilder);

SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
return parseSuggestResponse(response, "suggest_book_name");

}


private BaseResponse<List<String>> parseSuggestResponse(SearchResponse response, String suggestionName) {
List<String> suggestions = response.getSuggest().getSuggestion(suggestionName).getEntries().stream()
.flatMap(entry -> entry.getOptions().stream())
.map(option -> option.getText().string())
.collect(Collectors.toList());

BaseResponse<List<String>> baseResponse = new BaseResponse<>();
baseResponse.setData(suggestions);
return baseResponse;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@JsonInclude(JsonInclude.Include.NON_NULL)
@Getter
@Setter
@NoArgsConstructor
public class BaseResponse<T> {
private String message;
Expand Down

0 comments on commit 7abd632

Please sign in to comment.