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

Hyebin Lee·2022년 4월 20일
0

knockknock 개발일지

목록 보기
27/29
post-thumbnail
post-custom-banner

참고한 링크

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); }
   
post-custom-banner

1개의 댓글

comment-user-thumbnail
2023년 11월 2일

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

답글 달기