2024. 2. 13. 22:05ㆍSpring 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 |