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)를 별도의 파일로 관리하기 때문입니다.
해당 문제는 다음 글에서 다루도록 하겠습니다.
참고