์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ Elasticsearch๋กœ ๊ฒ€์ƒ‰์—”์ง„์„ ๋‹ด๋‹นํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

ํ”„๋ก ํŠธ์—์„œ ๊ฒ€์ƒ‰์–ด๋ฅผ SpringBoot ์„œ๋ฒ„๋กœ ๋„˜๊ฒจ์ฃผ๋ฉด SpringBoot์—์„œ Elasticsearch์— api๋ฅผ ํ˜ธ์ถœํ•ด์„œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๋กœ์ง์„ ์งœ์•ผํ•œ๋‹ค.

๋‚˜์˜ ๊ฒฝ์šฐ๋Š” Elasticsearch์˜ Search API๋งŒ ์‚ฌ์šฉํ•  ์˜ˆ์ •์ด๋‹ค!!!


๐Ÿ›  ๊ฐœ๋ฐœ ํ™˜๊ฒฝ

  • SpringBoot 2.7.3
  • Java 8
  • Elasticsearch 7.9.1

๐Ÿ““ ์ฐธ๊ณ ์ž๋ฃŒ

[์—˜๋ผ์Šคํ‹ฑ์„œ์น˜ ์‹ค๋ฌด ๊ฐ€์ด๋“œ]

๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋‚ด์šฉ์ด ๋„ˆ๋ฌด ์ž˜ ๋‚˜์™€์žˆ์–ด์„œ ์ฐธ๊ณ ํ•˜์˜€๋‹ค.

์•„์‰ฌ์šด ์ ์€ ์ €์ž๋Š” ์—˜๋ผ์Šคํ‹ฑ์„œ์น˜ 6๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์ ...

 

๋‚˜๋Š” ์ด ์ฑ…์˜ High Level Rest ํด๋ผ์ด์–ธํŠธ๋กœ ํ†ต์‹ ํ•˜๋Š” ๋ฒ•์„ ์ ์šฉํ•ด๋ณด์•˜๋‹ค.


๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป build.gradle

dependency ์ถ”๊ฐ€!

dependencies {

   implementation 'org.springframework.data:spring-data-elasticsearch:4.2.2'

}

 

๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป Configuration ํŒŒ์ผ

AbstractElasticsearchConfiguration ์„ ์ƒ์†๋ฐ›์€ ํ›„ elasticsearchClient ๋ฅผ ์žฌ์ •์˜ ํ•œ๋‹ค. 

connectedTo์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์—๋Š” elasticsearch์˜ ํ˜ธ์ŠคํŠธ๋„ค์ž„ + ํฌํŠธ๋ฒˆํ˜ธ (์˜ˆ. localhost:9200)๋ฅผ String์œผ๋กœ ๋„˜๊ฒจ์ฃผ๋ฉด ๋œ๋‹ค.

 

๋‚˜๋Š” application.yml ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์—ฌ host์™€ port๋ฅผ  ์ €์žฅํ•˜๊ณ  ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉํ–ˆ๋‹ค.

๊ตณ์ด ์ด๋ ‡๊ฒŒ ์•ˆํ•ด๋„ ๋œ๋‹ค....!

@EnableElasticsearchRepositories
@Configuration
public class ElasticSearchConfig extends AbstractElasticsearchConfiguration {

    @Value("${es.host}")
    private String host;

    @Override
    public RestHighLevelClient elasticsearchClient() {
        ClientConfiguration clientConfiguration = ClientConfiguration.builder()
                .connectedTo(host)
                .build();
        return RestClients.create(clientConfiguration).rest();
    }

}

 

๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป ๊ฒ€์ƒ‰ API ์‚ฌ์šฉํ•˜๊ธฐ - YoutuberServiceImpl.java

์œ„์—์„œ ์žฌ์ •์˜๋ฅผ ํ†ตํ•ด RestHighLevelClient๊ฐ€ Bean์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ๊ณ , ServiceImpl์—์„œ ์ด๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.

private final RestHighLevelClient restHighLevelClient;

 

SearchSourceBuilder๋ฅผ ํ†ตํ•ด ๊ฒ€์ƒ‰ ์ฟผ๋ฆฌ๋ฅผ ์„ค์ •ํ•œ๋‹ค.

org.elasticsearch.index.query.QueryBuilders.matchQuery

  • "channel_name" : ๊ฒ€์ƒ‰ํ•  ํ•„๋“œ๋ช…
  • keyword : ๊ฒ€์ƒ‰์–ด
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(matchQuery("channel_name", keyword));

 

SearchRequest๋กœ ๊ฒ€์ƒ‰ ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค.

์ƒ์„ฑ์ž์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๊ฒ€์ƒ‰ํ•  ์ธ๋ฑ์Šค๋ฅผ ๋„˜๊ฒจ์ค€๋‹ค.

SearchRequest searchRequest = new SearchRequest(index);
searchRequest.source(searchSourceBuilder);

 

SearchResponse๋กœ ์‘๋‹ต์„ ๋ฐ›๋Š”๋‹ค.

searchResponse.getHits()๋กœ SearchHits๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ์‹ค์ œ ๊ฒฐ๊ณผ๋ฟ๋งŒ์•„๋‹ˆ๋ผ ๋ถ€๊ฐ€์ ์ธ ์ •๋ณด๋“ค๋„ ๋‹ด๊ฒจ์žˆ๋‹ค.

SearchHis.getHits() (์•„๋ž˜์—์„  searchResponse.getHits().getHits()) ์œผ๋กœ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

ํ•„์ž๋Š” ์ด ๊ฒฐ๊ณผ๋ฅผ Dto๋กœ ๋ณ€ํ™˜ํ•ด์•ผํ•ด์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์˜€๋‹ค.

try{
    SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

    return Arrays.stream(searchResponse.getHits().getHits())
            .map(hit -> YoutuberResponseDto.toResponseDto(hit.getSourceAsMap()))
            .collect(Collectors.toList());

} catch (IOException e) {
    throw new RuntimeException(e);
}

 

< ์ „์ฒด์ฝ”๋“œ >

public List<YoutuberResponseDto> searchYoutuber(String keyword) {
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    searchSourceBuilder.query(matchQuery("channel_name", keyword));

    SearchRequest searchRequest = new SearchRequest(index);
    searchRequest.source(searchSourceBuilder);

    try{
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        return Arrays.stream(searchResponse.getHits().getHits())
                .map(hit -> YoutuberResponseDto.toResponseDto(hit.getSourceAsMap()))
                .collect(Collectors.toList());

    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

์ด๋ ‡๊ฒŒ ์™„์„ฑ์ด ๋˜์—ˆ๊ณ  ๋™์ž‘๋„ ์ž˜๋œ๋‹ค..

ํ•˜๋‚˜ ์ฐ์ฐํ•œ ์ ์€ ๋ฐ”๋กœ RestHighLevelClient๊ฐ€ ๋ฐ”๋กœ Deprecated ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค... ํ•˜๐Ÿคฆ๐Ÿป‍โ™€๏ธ

์ˆ˜์ •ํ•ด์•ผ ๋  ๋“ฏ ํ•˜๋‹ค...ใ…Žใ…Ž

 

๊ทธ๋ฆฌ๊ณ  Repository๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋„ํ๋จผํŠธ ์ €์žฅ์ด๋‚˜ ์กฐํšŒ ๋“ฑ์ด ์ „๋ถ€ ๊ฐ€๋Šฅํ•˜๋‹ค๋˜๋ฐ ์ด ๋ถ€๋ถ„๋„ ๊ธฐํšŒ๊ฐ€ ๋˜๋ฉด ์‚ฌ์šฉํ•ด๋ณด๊ณ  ํฌ์ŠคํŒ…ํ•ด์•ผ๊ฒ ๋‹ค.

728x90

BELATED ARTICLES

more