[Elasticsearch] SpringBoot์ Elasticsearch ์ฐ๋ํ๊ธฐ
์ด๋ฒ ํ๋ก์ ํธ์์ 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๋ฅผ ๋ง๋ค์ด์ ๋ํ๋จผํธ ์ ์ฅ์ด๋ ์กฐํ ๋ฑ์ด ์ ๋ถ ๊ฐ๋ฅํ๋ค๋๋ฐ ์ด ๋ถ๋ถ๋ ๊ธฐํ๊ฐ ๋๋ฉด ์ฌ์ฉํด๋ณด๊ณ ํฌ์คํ ํด์ผ๊ฒ ๋ค.
'Elasticsearch' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Elasticsearch] Spring Boot์์ ์์ฒญํ ์์๋๋ก ๋ฐํ๋ฐ๋ ๋ฒ (0) | 2022.10.09 |
---|