Caused by: co.elastic.clients.elasticsearch._types.ElasticsearchException: [es/indices.create] failed: [illegal_argument_exception] Unknown filter type [nori_part_of_speech] for [nori_part_of_speech]
at co.elastic.clients.transport.ElasticsearchTransportBase.getApiResponse(ElasticsearchTransportBase.java:345) ~[elasticsearch-java-8.15.5.jar:na]
at co.elastic.clients.transport.ElasticsearchTransportBase.performRequest(ElasticsearchTransportBase.java:147) ~[elasticsearch-java-8.15.5.jar:na]
at co.elastic.clients.elasticsearch.indices.ElasticsearchIndicesClient.create(ElasticsearchIndicesClient.java:277) ~[elasticsearch-java-8.15.5.jar:na]
at org.springframework.data.elasticsearch.client.elc.IndicesTemplate.lambda$doCreate$0(IndicesTemplate.java:147) ~[spring-data-elasticsearch-5.4.4.jar:5.4.4]
at org.springframework.data.elasticsearch.client.elc.ChildTemplate.execute(ChildTemplate.java:71) ~[spring-data-elasticsearch-5.4.4.jar:5.4.4]
... 72 common frames omitted

{
"analysis": {
"filter": {
"nori_readingform": {
"type": "nori_readingform"
},
"nori_part_of_speech": {
"type": "nori_part_of_speech",
"stoptags": ["E", "IC", "J", "SP", "SSC", "SSO", "SC"]
},
"word_delimiter": {
"type": "word_delimiter",
"split_on_case_change": true,
"split_on_numerics": true,
"generate_word_parts": true,
"generate_number_parts": true,
"catenate_all": false,
"catenate_words": false,
"preserve_original": false
},
"custom_snowball_filter": {
"type": "snowball",
"language": "English"
}
},
"analyzer": {
"korean": {
"type": "custom",
"tokenizer": "nori_tokenizer",
"filter": ["nori_part_of_speech", "nori_readingform"]
},
"custom_snowball": {
"type": "custom",
"tokenizer": "standard",
"filter": ["lowercase", "word_delimiter", "custom_snowball_filter"]
},
"mixed_analyzer" : {
"type" : "custom",
"tokenizer" : "nori_tokenizer",
"filter" : ["nori_part_of_speech", "nori_readingform", "word_delimiter", "lowercase"]
}
},
"normalizer": {
"lowercase_normalizer": {
"type": "custom",
"filter": ["lowercase"]
}
}
}
}
제가 작성한 ElasticSearch를 사용하기 위한 setting.json 파일인데 여기서 nori라는 형태소분석기를 사용하여 한국어를 형태소 분리하려 하고 있습니다.
허나 오류의 주요 코드를 보시면
Caused by: co.elastic.clients.elasticsearch._types.ElasticsearchException: [es/indices.create] failed: [illegal_argument_exception] Unknown filter type [nori_part_of_speech] for [nori_part_of_speech]
filter 중 nori_part_of_speech 가 unknown 필터라면서 스프링 프로젝트가 실행되고 있지 않는 모습입니다.
nori 형태소 분석기는 기본적으로 제공되는 것이 아닌 사용자가 ElasticSearch에 설치해야하기 때문입니다.
그렇기 때문에 ElasticSearch 내부에 nori 형태소 분석기를 설치해주면 해결될 오류로 보입니다.
docker를 이용한 nori 형태소 분석기 설치하는 방법
현재 저희의 프로젝트는 docker를 이용하여 elaticsearch를 이용 중 이기 때문에 docker를 이용하여 nori를 설치해야합니다.
- docker-composefile.yml 이 존재하는 프로젝트 폴더로 ubuntu를 이용하여 경로를 이동합니다.
제 컴퓨터가 윈도우라서 /mnt 라는 명령어를 붙여 사용했지만 윈도우가 아니신 분들은 /mnt 는 빼시면 됩니다.cd /mnt/d/projects/count10shop - docker compose up 명령어를 통해 elasticsearch를 실행시킵니다.

- docker ps 명령어를 통해 elasticsearch의 container id 혹은 name을 확인합니다.

- docker exec -it (container id 또는 name을 입력한다.) /bin/bash 명령어로 해당 컨테이너 내부로 이동합니다.

- ./bin/elasticsearch-plugin install analysis-nori 명령어로 해당 컨테이너 내부에 nori 형태소 분석기를 설치합니다.

- exit 을 입력하여 컨테이너에서 나온 뒤 docker compose stop 으로 멈추고 다시 docker compose start로 재실행합니다.


위 과정을 거치면 노리 형태소 분석기가 엘라스틱서치 내부에 설치되어 정상적으로 실행되는 모습을 확인할 수 있습니다.