본문 바로가기

삽질

[Spring Boot] Caused by: RestStatusException{status=400} org.springframework.data.elasticsearch.RestStatusException: Elasticsearch exception [type=illegal_argument_exception, reason=Unknown tokenizer type [nori_tokenizer] for [ksb_custom_korean_tokenize..

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)별도의 파일로 관리하기 때문입니다.

 

해당 문제는 다음 글에서 다루도록 하겠습니다.

 

참고

https://velog.io/@backtony/Spring-Data-Elasticsearch-%EC%97%B0%EB%8F%99-%EB%B0%8F-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%9E%91%EC%84%B1%ED%95%98%EA%B8%B0

 

Spring Data Elasticsearch 연동 및 테스트 작성하기

9200번 포트는 HTTP 클라이언트와 통신에 사용되며, 9300번 포트는 노드들간 통신 시에 사용됩니다.Elastic Stack은 버전정보에 민감하고 버전이 굉장히 빠르게 업데이트되기 때문에 버전을 잘 맞춰야

velog.io