SpringBoot + ElasticSearch 연동 및 간단 API 호출해보기
프로그래밍/ElasticSearch
[elasticsearch + Spring] elasticsearch를 Java Spring에서 사용해보자 - 환경설정과 Index 만들기
프로그래밍/ElasticSearch
[elasticsearch + Spring] elasticsearch를 Java Spring에서 사용해보자 - Document CRUD 만들기
SpringBoot ElasticSearch Config
Java 에서 Elastic Search 사용하기 - 1. Get Request
https://docs.spring.io/spring-data/elasticsearch/docs/4.0.0.M4/reference/html/#preface
https://juntcom.tistory.com/137
https://github.com/netcrazy/elasticsearch-jaso-analyzer
한글 자소단위 검색어 자동완성을 구현하기 위해 위의 analyzer가 지원하는 7.16.2 버전의 elasticsearch를 사용했다.
{ "settings": {
"index": {
"analysis": {
"filter": {
"suggest_filter": {
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 50
}
},
"tokenizer": {
"jaso_search_tokenizer": {
"type": "jaso_tokenizer",
"mistype": true,
"chosung": false
},
"jaso_index_tokenizer": {
"type": "jaso_tokenizer",
"mistype": true,
"chosung": true
}
},
"analyzer": {
"suggest_search_analyzer": {
"type": "custom",
"tokenizer": "jaso_search_tokenizer"
},
"suggest_index_analyzer": {
"type": "custom",
"tokenizer": "jaso_index_tokenizer",
"filter": [
"suggest_filter"
]
}
}
}
}
}
}'
hashtag라는 이름으로 인덱스를 생성했다.
해당 인덱스의 analyzer는 위에 언급한 한국어자소 분석기이다!
{"properties": {
"tag": {
"type": "text",
"store": true,
"analyzer": "suggest_index_analyzer",
"search_analyzer": "suggest_search_analyzer"
}
}
}
각 태그에 분석기를 매핑시켜주었다.
//elasticsearch
implementation 'org.springframework.boot:spring-boot-starter-data-elasticsearch'
elasticsearch:
host: 127.0.0.1
port: 9200
연결할 elasticsearch 호스트 ip주소랑 port를 설정한다.
나는 아직 배포 안하고 로컬에서 돌리고 있어서 로컬 ip로 지정했다.
@Configuration
@Slf4j
public class ElkConfig {
@Value("${elasticsearch.host}")
private String hostname; //localhost
@Value("${elasticsearch.port}")
private Integer port; // 9200
@Bean
public RestHighLevelClient client(){
ClientConfiguration clientConfiguration = ClientConfiguration.builder()
.connectedTo(hostname+":"+port)
.build();
return RestClients.create(clientConfiguration).rest();
}
@Bean
public ElasticsearchOperations elasticsearchTemplate(){
return new ElasticsearchRestTemplate(client());
}
}
이 때 @Value
어노테이션은
import org.springframework.beans.factory.annotation.Value;
여기서 import받아야 한다!
Document는 내가 넣을 index 테이블이다.
@Entity와 동일하다고 생각하면 된다.
컬럼의 경우 @Field
를 사용한다.
@Setter
@Document(indexName = "hashtag")
public class Hashtag {
@Id @GeneratedValue
private String id;
private String tag;
}
이 때 posthashtags와 같이 elasticsearch에 넣고 싶지 않은 필드는 @Transient
어노테이션을 붙여주면 된다.
이거 안붙이고 fk까지 등록하려고 하면 elasticsearch에 저장이 안될 수 있음 (에러는 딱히 안나는 것 같다)
@Entity
@Document(indexName = "hashtag")
@Getter @Setter
public class HashTag {
@Id @GeneratedValue
@Column(name="tag_id")
private Long id;
private String tag;
@Transient
@OneToMany(mappedBy = "hashtag")
private List<PostHashTag> posthashtags = new ArrayList<>();
}
https://docs.spring.io/spring-data/elasticsearch/docs/4.0.0.M4/reference/html/#repositories
JPARepository와 유사하다고 생각하면 된다.
public interface HashTagElasticsearchRepository extends ElasticsearchRepository<Hashtag,String> {
}
@Resource
HashtagEsRepository hashtagEsRepository;
@Test void test(){
Hashtag hashtag = new Hashtag();
hashtag.settag("해시태그");
hashtagEsRepository.save(blog); }
안녕하세요. 좋은글 감사드립니다. 혹시 aws 서버에서 테스트를 해보려면 elasticsearch의 host와 port 번호만 바꾸면 되는지 문의드려요! 프론트와 함께 연동 테스트중인데 따로 엘라스틱서치 설치를 안해도 되는건가요?