Elasticsearch

2024. 2. 13. 22:05Spring Boot

Spring boot에서 Elasticsearch를 사용하는 데는 

주로 spring-Data-Elastic과 spring-boot-starter-data-elastic이 주로 쓰인다


이중에서 spring-boot-starter-data-elastic는 rest-high-level-client라는 걸 이용했었는데
Elasticsearch 7.15.0에서 depreated되었다

https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high.html

 

Java High Level REST Client | Java REST Client [7.17] | Elastic

Deprecated in 7.15.0. The High Level REST Client is deprecated in favour of the Java API Client. The Java High Level REST Client works on top of the Java Low Level REST client. Its main goal is to expose API specific methods, that accept request objects as

www.elastic.co

 

그래서 최신 버전은 이제 ElasticsearchClient를 사용해야 한다.

 

 

 

이번 예제는 최신 버전을 사용할 것이기 때문에 ElasticsearchClient를 사용하겠다

 

 

 

import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.elasticsearch.config.ElasticsearchConfigurationSupport;
import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories;

import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import co.elastic.clients.transport.ElasticsearchTransport;
import co.elastic.clients.transport.rest_client.RestClientTransport;

@Configuration
@EnableElasticsearchRepositories(basePackages = "com.example.demo.elasticSearch")
@ComponentScan(basePackages = { "com.example.demo.elasticSearch" })
public class elasticConfig extends ElasticsearchConfigurationSupport{
    
    @Bean
    public ElasticsearchClient esClient() {
        RestClient client = RestClient
        .builder(new HttpHost("localhost", 9200, "http"))
        .build();
        ElasticsearchTransport transport = new RestClientTransport(client, new JacksonJsonpMapper());
        return new ElasticsearchClient(transport);
    }

}

 

 

import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

interface elasticRepository extends ElasticsearchRepository<my_entity, String> {
    
}

 

 

import java.util.Optional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch.core.GetResponse;

@Service
public class elasticService {
    
    @Autowired
    elasticRepository repo;

    @Autowired
    ElasticsearchClient client;

    public void save_data(my_entity entity) {
        repo.save(entity);
        
    }

    public void save_data2(my_entity entity) {
        try {
        client.index(i -> i
        .index("my_index")
        .id(entity.getId())
        .document(entity));
        } catch(Exception e) {
            
        }
    }
    public my_entity get_data(String id) {
        Optional<my_entity> entity = repo.findById(id);
        return entity.get();
    }

    public my_entity get_data2(String id) { 
        my_entity entity = null;  
        try {
            GetResponse<my_entity> res = client.get(g-> g
            .index("my_index")
            .id(id),
            my_entity.class);
            entity = res.source();
        } catch(Exception e) {
                
        }
        return entity;    
    }

    public void update_data(String id, String name) {
        if(get_data(id) != null) {
            repo.save(new my_entity(id, name));
        }
    }

    public void update_data2(String id, String name) {
        try {
            client.update(u -> u
                .index("my_index")
                .id(id)
                .doc(new my_entity(id, name)),
                my_entity.class
            );
        } catch(Exception e) {

        }
    }

    public void delete_data(String id) {
        repo.deleteById(id);
    }

    public void delete_data2(String id) {
        try {
        client.delete(d -> d
            .index("my_index")
            .id(id));
        } catch(Exception e) {
            
        }
    }
}

 

 

repository를 이용한 것과 바로 esclient를 이용한 것에 작은 차이가 있다

 

 

repository를 이용해 저장한 데이터는 _class field에 자신의 class를 기록해 두는데 이게 있을 경우 

esclient로 바로 읽을 경우 오류가 생긴다

 

반대로 esClient로 저장한 데이터는 _class가 없는데 이 데이터를 repository로 읽어 들이는 데에는 아무런 지장이 없었다

 

'Spring Boot' 카테고리의 다른 글

Web Socket By STOMP  (0) 2024.02.19
Redis Pub/Sub  (0) 2024.02.19
Image File Handling  (0) 2024.02.03
Mulit Database by MySQL  (0) 2024.02.03
Redis  (0) 2024.01.28