![[ElasticSearch] 한글 검색 최적화(Nori Analyzer)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdbzBJI%2FbtsOlxBYhlu%2F28FQhOMkBREl6PjfLvrw2k%2Fimg.png)
[ElasticSearch] 한글 검색 최적화(Nori Analyzer)Back-End/ElasticSearch2025. 6. 1. 00:39
Table of Contents
이 글은 인프런의 지식 공유자 박재성님의 강의를 듣고 개인적으로 정리하는 글임을 알립니다.
스탠다드 애널라이저는 영어에 최적화된 유연한 검색 기능을 제공하지만, 한글에 적합하지는 않다.
따라서 한글에 맞는 애널라이저인 Nori Analyzer를 써야 한다.
노리 애널라이저가 설치된 도커 컨테이너
Dockerfile
FROM docker.elastic.co/elasticsearch/elasticsearch:8.17.4 # Nori Analyzer 플러그인 설치 RUN bin/elasticsearch-plugin install analysis-nori |
compose.yml
services: elastic: build: context: . dockerfile: Dockerfile ports: - 9200:9200 # 9200번 포트에서 Elasticsearch 실행 environment: # 아래 설정은 개발/테스트 환경에서 간단하게 테스트하기 위한 옵션 (운영 환경에서는 설정하면 안 됨) - discovery.type=single-node # 단일 노드 - xpack.security.enabled=false # 보안 설정 - xpack.security.http.ssl.enabled=false # 보안 설정 kibana: image: docker.elastic.co/kibana/kibana:8.17.4 # 8.17.4 버전 ports: - 5601:5601 # 5601번 포트에서 kibana 실행 environment: - ELASTICSEARCH_HOSTS=http://elastic:9200 # kibana에게 통신할 Elasticsearch 주소 알려주기 |
docker compose up -d
Analyze API 활용해 분석
// 방법 1 GET /_analyze { "text": "백화점에서 쇼핑을 하다가 친구를 만났다.", "analyzer": "nori" } // 방법 2 (nori analyzer의 구성을 직접 명시) GET /_analyze { "text": "백화점에서 쇼핑을 하다가 친구를 만났다.", "char_filter": [], "tokenizer": "nori_tokenizer", "filter": ["nori_part_of_speech", "nori_readingform", "lowercase"] } |
- nori_part_of_speech : 의미 없는 조사(을, 의 등), 접속사 등을 제거
- nori_readingform : 한자를 한글로 바꿔서 토큰으로 저장
노리 애널라이저를 활용한 인덱스 생성
// 인덱스 생성 + 매핑 정의 + Custom Analyzer 적용 PUT /boards { "settings": { "analysis": { "analyzer": { "boards_content_analyzer": { "char_filter": [], "tokenizer": "nori_tokenizer", "filter": ["nori_part_of_speech", "nori_readingform", "lowercase"] } } } }, "mappings": { "properties": { "content": { "type": "text", "analyzer": "boards_content_analyzer" } } } } |
한글 + 영어가 섞인 글을 유연하게 검색하는 방법
한글(korean)과 영어(english)가 섞여있는 글이라면 Nori Analyzer와 character filter나 token filter를 추가해서 사용하면 된다.
애널라이저의 filter 부분에 stop + stemmer 필터를 적용하면 영어의 불용어가 제거되고 영단어가 기본 형태로 바뀌어 조금 더 유연하게 처리된다.
데이터 삽입
POST /boards/_doc { "content": "백화점에서 쇼핑을 하다가 친구를 만났다." } |
이제 한글로도 유연하게 검색을 할 수 있다.
GET /boards/_search { "query": { "match": { "content": "백화점" } } } GET /boards/_search { "query": { "match": { "content": "쇼핑" } } } GET /boards/_search { "query": { "match": { "content": "친구" } } } |
'Back-End > ElasticSearch' 카테고리의 다른 글
[ElasticSearch] 오타 허용 검색, 하이라이팅, 페이지네이션 및 정렬 (0) | 2025.06.01 |
---|---|
[ElasticSearch] match, term, bool (3) | 2025.06.01 |
[ElasticSearch] 데이터 타입(data type)과 매핑(mapping) (0) | 2025.05.31 |
[ElasticSearch] 애널라이저(Analyzer) (0) | 2025.05.31 |
[ElasticSearch] 역인덱스(Inverted Index) (0) | 2025.05.31 |