[SpringBoot, ElasticSearch] KnockKnock 개발일지 - 0419(Elasticsearch와 SpringBoot 서버 연동하기)

Hyebin Lee·2022년 4월 20일
0

knockknock 개발일지

목록 보기
27/29
post-thumbnail

참고한 링크

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

1. ElasticSearch 구축하기

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"
    }
  }
}


각 태그에 분석기를 매핑시켜주었다.

2. ElasticSearch 와 SpringBoot 연동

build.gradle 설정파일

//elasticsearch 
implementation 'org.springframework.boot:spring-boot-starter-data-elasticsearch'

application.yml 설정

elasticsearch:
  host: 127.0.0.1
  port: 9200

연결할 elasticsearch 호스트 ip주소랑 port를 설정한다.
나는 아직 배포 안하고 로컬에서 돌리고 있어서 로컬 ip로 지정했다.

Config 생성하기

@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받아야 한다!

3. Document CRUD 만들기

1. Document 객체 생성

Document는 내가 넣을 index 테이블이다.
@Entity와 동일하다고 생각하면 된다.
컬럼의 경우 @Field를 사용한다.

@Setter
@Document(indexName = "hashtag")
public class Hashtag {

    @Id @GeneratedValue
    private String id;
    private String tag;
}

@Entity와 중복 사용가능

이 때 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<>();

}

2. ElasticsearchRepository

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); }
   

1개의 댓글

comment-user-thumbnail
2023년 11월 2일

안녕하세요. 좋은글 감사드립니다. 혹시 aws 서버에서 테스트를 해보려면 elasticsearch의 host와 port 번호만 바꾸면 되는지 문의드려요! 프론트와 함께 연동 테스트중인데 따로 엘라스틱서치 설치를 안해도 되는건가요?

답글 달기

관련 채용 정보