Spring boot elasticsearch 연동(local)

seongcheollee·2023년 12월 1일
0

구성

build.gradle
	implementation 'org.springframework.boot:spring-boot-starter-data-elasticsearch'
	implementation 'org.elasticsearch.client:elasticsearch-rest-high-level-client:7.17.13'

ElasticSearch Config 작성

@Configuration
@EnableElasticsearchRepositories(basePackages = "레포지토리위치") // Elasticsearch repository 패키지 설정
public class ElasticSearchConfig {

    @Bean(destroyMethod = "close")
    public RestHighLevelClient restHighLevelClient() {
        return new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("localhost", 9200, "http") // Elasticsearch 호스트 및 포트 설정
                )
        );
    }
}
엔터티(도큐먼트) 구성
@Data
@Document(indexName = "music")
@NoArgsConstructor
public class MusicInfo{

    @Id
    private String id;
    private String artist;
    private String musicFileName;
    private String musicFileUrl;
}

repository 구성

@Repository
public interface MusicInfoRepository extends ElasticsearchRepository<MusicInfo, Long> {
    List<MusicInfo> findByMusicFileName(@Param("MusicName") String musicName);
    List<MusicInfo> findByArtist(@Param("Artist") String Artist);
}

Service 구성

//ElasticsearchOperations (elasticsearchTemplate)
  @Override
    public List<MusicInfo> findByArtist(String artist) {
        NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
                .withQuery(QueryBuilders.boolQuery()
                        .should(QueryBuilders.matchPhrasePrefixQuery("artist", artist))
                        .should(QueryBuilders.wildcardQuery("artist", "*" + artist + "*"))
                )
                .build();


        SearchHits<MusicInfo> searchHits = elasticsearchTemplate.search(searchQuery, MusicInfo.class);
        return searchHits.getSearchHits().stream()
                .map(SearchHit::getContent)
                .collect(Collectors.toList());
    }

// elasticRepository
    @Override
    public List<MusicInfo> saveAll(List<MusicInfo> musicInfos) {
        return (List<MusicInfo>) musicInfoRepository.saveAll(musicInfos);
    }

해당 코드들은 실제로 사용되는 코드는 아니고 elasticsearch에 대한 이해를 위해 간단하게 구성된 코드입니다.

결과

업로드중..

의문

    1. ElasticsearchOperations vs elasticRepository
    1. Entity 와 document 를 같이 사용하면 안될까?

Todo

    1. elasticsearch 기본 이해
    1. elasticsearch Query 사용법 숙지

https://docs.spring.io/spring-data/elasticsearch/docs/current-SNAPSHOT/reference/html/#reference

공부 후 위의 의문에 대해 차차 답해볼 예정입니다.

0개의 댓글