Spring Boot에서 Elasticsearch 테스트 컨테이너를 띄우는 도중 위와 같은 문제를 만났습니다.
코드는 아래와 같습니다.
@TestConfiguration
@EnableElasticsearchRepositories(basePackageClasses = {UserSearchRepository.class,UserSearchQueryRepository.class})
public class ElasticTestContainer extends AbstractElasticsearchConfiguration{
    private static final String ELASTICSEARCH_VERSION = "7.10.2";
    private static final DockerImageName ELASTICSEARCH_IMAGE =
            DockerImageName
                    .parse("docker.elastic.co/elasticsearch/elasticsearch")
                    .withTag(ELASTICSEARCH_VERSION);
    private static final ElasticsearchContainer container;
    static {
        container = new ElasticsearchContainer(ELASTICSEARCH_IMAGE);
        container.start();
    }
	...
}
저의 경우 한글 분석을 위한 nori를 사용하기 때문에,
nori 분석기를 다운받아야 했습니다.
하지만, 위의 코드 방식으로는 nori를 다운받을 수 없어 다른 방법을 찾아야 했습니다.
그 방법은 GenericContainer를 사용하는 방법입니다.
testImplementation("org.testcontainers:junit-jupiter:1.16.3")@TestConfiguration
@EnableElasticsearchRepositories(basePackageClasses = UserSearchRepository.class)
public class ElasticTest extends AbstractElasticsearchConfiguration {
    private static final GenericContainer container;
    static{
        container = new GenericContainer(
                new ImageFromDockerfile().withDockerfileFromBuilder(
                        b -> {
                            b.from("docker.elastic.co/elasticsearch/elasticsearch:7.10.2")
                                    .run("bin/elasticsearch-plugin install analysis-nori")
                                    .build();
                        })
        ).withExposedPorts(9200, 9300).withEnv("discovery.type","single-node");
        container.start();
    }
    ....
}
위 코드를 사용하시면 엘라스틱서치 이미지에 nori 분석기를 다운받을 수 있습니다.
하지만, 저의 문제는 여기서 끝나지 않았습니다.
이유는 불용어(stopword)와 동의어(synonym)를 별도의 파일로 관리하기 때문입니다.
해당 문제는 다음 글에서 다루도록 하겠습니다.
참고
Spring Data Elasticsearch 연동 및 테스트 작성하기
9200번 포트는 HTTP 클라이언트와 통신에 사용되며, 9300번 포트는 노드들간 통신 시에 사용됩니다.Elastic Stack은 버전정보에 민감하고 버전이 굉장히 빠르게 업데이트되기 때문에 버전을 잘 맞춰야
velog.io
 
                  
                 
                  
                 
                  
                