텍스트 분석 개요
- 엘라스틱서치는 루씬 기반으로 구축된 텍스트 기반 검색 엔진으로 루씬이 제공하는 분석기를 그대로 활용한다.
- 엘라스틱서치는 텍스트를 처리하기 위해 기본적으로 분석기를 사용하기 때문에 생각하는 데로 동작하지 않는다.
- 엘라스틱 서치는 문서를 색인하기 전에 해당 문서의 필드 타입이 무엇인지 확인하고 텍스트 타입이면 분석기를 이용해 분석한다.
- 텍스트가 분석이 되면 개별 텀으로 나뉘어 형태소 형태로 분석된다.
- 형태소는 특정 원칙에 의해 필터링되어 단어가 삭제되거나 추가, 수정되고 최종적으로 역색인된다.
- 텍스트 분석은 언어별로 조금씩 다르게 동작하며, 엘라스틱 서치가 각각 다른 언어의 형태소를 분석할 수 있도록 언어별 분석기를 제공한다.
- 언어의 분석기가 없다면 직접 개발 및 Custom Analyzer를 설치해서 사용할 수 있다.
- 텍스트를 분석할 때 별도의 분석기를 지정하지 않으면 기본적으로 Standard Analyzer가 사용된다.
역색인 구조
역색인 구조란?
- 모든 문서가 가지는 단어의 고유 단어 목록
- 해당 단어가 어떤 문서에 속해 있는지에 대한 정보
- 전체 문서에 각 단어가 몇 개 들어있는지에 대한 정보
- 하나의 문서에 단어가 몇 번씩 출현했는지에 대한 빈도
색인할 때 특정한 규칙과 흐름에 의해 텍스트를 변경하는 과정을 분석이라고 하고 해당 처리는 분석기라는 모듈을 조합해서 이뤄진다.
분석기 구조

분석기 프로세스
- 문장을 특정한 규칙에 의해 수정한다.
- Character Filter: 문장을 분석하기 전 입력 텍스트에 대해 특정한 단어를 변경하거나 HTML과 같은 태그를 제거하는 역할을 한다.
- 텍스트 개별 토큰화 전의 전처리 과정
- 수정한 문장을 개별 토큰으로 분리한다.
- Tokenizer Filter: 분석기를 구성할 때 하나만 사용 가능하며, 텍스트를 어떻게 나눌 것인지를 정의
- 개별 토큰을 특정한 규칙에 의해 변경한다.
- Token Filter: 토큰화된 단어를 하나씩 필터링해서 사용자가 원하는 토큰으로 변환한다.
분석기는 데이터의 특성에 따라 원하는 분석 결과를 미리 예상해 보고, 해당 결과를 얻기 의한 옵션을 적용해 설정해야 한다.
분석기를 이용한 분석: 형태소가 어떻게 분석되는지를 확인할 수 있는 API
POST /_analyze
{
"analyzer": "standard",
"text": "캐리비안의 해적"
}
필드를 이용한 분석: 인덱스를 설정 시 분석기를 직접 설정할 수 있으며, 다양한 옵션과 필터를 적용할 수 있다.
POST movie_analyzer/_analyze
{
"field": "title",
"text": "캐리비안의 해적"
}
색인과 검색 시 분석기를 각각 설정: 색인할 때 사용되는 index 분석기와 검색할 때 사용되는 Search 분석기로 구분해서 구성할 수 있다.
PUT movie_analyzer
{
"settings": {
"index": {
"number_of_shards": 5,
"number_of_replicas": 1
},
"analysis": {
"analyzer": {
"movie_lower_test_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase"
]
},
"movie_stop_test_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"english_stop"
]
}
},
"filter": {
"english_stop": {
"type": "stop",
"stopwords": "_english_"
}
}
}
},
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "movie_stop_test_analyzer",
"search_analyzer": "movie_lower_test_analyzer"
}
}
}
}
- 분석기를 매핑할 때 기본적으로 analyzer 항목을 이용해 설정하는데, 이는 색인 시점과 검색 시점 동일한 분석기를 사용한다는 의미
- 각 시점에 서로 다른 분석기를 사용하려면 search_analyzer 항목을 이용해 검색 시점의 분석기를 재정의 해야 한다
대표적인 분석기
Standard Analyzer
- 공백, 특수 문자를 기준으로 토큰을 분리하고 모든 문자를 소문자로 변경하는 토큰 Filter 사용
- 아무런 정의 없이 필드의 데이터 타입을 text 데이터 타입으로 사용하면 기본값으로 사용하게 된다.
- Token Filter
- Standard Token Filter
- Lower Case Token Filter
- 옵션
- max_token_length: 최대 토큰 길이를 초과하는 토큰이 보일 경우 length를 간격으로 분할
- stopwords: 사전 정의된 불용어 사전을 사용
- stopwords_path: 불용어가 포함된 파일을 사용할 경우의 서버의 경로로 사용
WhiteSpace Analyzer
- 공백 문자열을 기준으로 토큰을 분리
- Token Filter: X
Keyword Tokenizer
- 전체 입력 문자열을 하나의 키워드처럼 처리한다.(토큰화 작업 X)
- Token Filter: X
Character Filter
엘라스틱 서치에서 제공하는 분석기는 전처리 필터를 이용한 데이터 정제 후 토크나이저를 이용해 본격적인 토큰 분리 작업을 수행한다.
토크나이저 내부에서도 전처리가 가능하기 때문에 상대적으로 활용도가 많이 떨어진다.
Html Strip Char Filter
- 문장에서 HTML을 제거하는 전처리 필터
- 필터 옵션
- escaped_tags: 특정 태그만 삭제한다.
Tokenizer Filter
분석기를 구성하는 가장 핵심 구성요소로, 전처리 필터를 거쳐 토크나이저 필터로 넘어오면 해당 텍스트는 Tokenizer 특성에 맞게 적절히 분리된다.
Standard Tokenizer
- 엘라스틱서치에서 일반적으로 사용하는 토크나이저로 대부분의 기호를 만나면 토큰으로 나눈다.
- 옵션
- max_token_length: 최대 토큰 길이를 초과하는 경우 해당 간격으로 토큰을 분할
whitespce tokenizer
- 공백을 만나면 텍스트를 토큰화한다.
- 옵션
- max_token_length: 최대 토큰 길이를 초과하는 경우 해당 간격으로 토큰을 분할한다.
Ngram tokenizer
- Ngram은 기본적으로 한 글자씩 토큰화하며, 특정 문자를 지정할 수도 있다.
- 지정된 문자의 목록 중 하나를 만날 때마다 단어를 자른다.
- 옵션
- min_gram: Ngram을 적용할 문자의 최소 길이를 나타낸다.
- max_gram: Ngram을 적용할 문자의 최대 길이를 나타낸다.
- token_chars: 토큰에 포함할 문자열을 지정한다.
- letter(문자), digit(숫자)... 등
Edge Ngram Tokenizer
- 지정된 문자의 목록 중 하나를 만날때마다 시작 부분을 고정시켜 단어를 자르는 방식으로 사용하는 토크나이저
- 옵션
- min_gram: Ngram을 적용할 문자의 최소 길이를 나타낸다.
- max_gram: Ngram을 적용할 문자의 최대 길이를 나타낸다.
- token_chars: 토큰에 포함할 문자열을 지정한다.
- letter(문자), digit(숫자)... 등
keyword Tokenizer
- 텍스트를 하나의 토큰으로 만든다.
- 옵션
- buffer_size: 텀을 버퍼로 읽어 들일 문자 수를 지정한다.
Token Filter
토크나이저에서 분리된 토큰들을 변형하거나 추가, 삭제할 때 사용하는 필터로 토크나이저에 의해 토큰이 모두 분리돼야 동작하기 때문에 독립적으로 사용할 수 없다.
Ascii Folding Token Filter
- 아스키코드에 해당하는 127개 알파벳, 숫자, 기호에 해당하지 않는 경우 문자를 ASCII 요소로 변경한다.
Lowercase Token Filter
- 토큰을 구성하는 전체 문자열을 소문자로 변환
Uppercase Token Filter
- 토큰을 구성하는 전체 문자열을 대문자로 변환한다.
Stop Token Filter
- 불용어로 등록할 사전을 구축해서 사용하는 필터
- 인덱스로 만들고 싶지 않거나 검색되지 않게 하고 싶은 단어를 등록해서 해당 단어에 대한 불용어 사전을 구축한다.
- 옵션
- stopwords: 불용어를 매핑에 직접 등록해서 사용
- stopwords_path: 불용어 사전이 존재하는 경로를 지정한다.(엘라스틱 서버가 있는 config 폴더 안에 생성)
- ignore_case: true로 지정 시, 모든 단어를 소문자로 변경해서 저장한다.
Stemmer Token Filter
- Stemming 알고리즘을 사용해 토큰을 변형하는 필터
- 옵션
- name: 다른 나라의 언어 사용이 가능하지만 한글은 지원 안 한다.
Synonym 토큰 필터
- 동의어 처리할 수 있는 필터
- 옵션
- synonyms: 동의어로 사용할 단어를 등록한다.
- synonyms_path: 파일로 관리할 경우 엘라스틱서치 서버의 config 폴더 아래에 생성
trim Token Filter
- 앞뒤 공백을 제거하는 토큰 필터
동의어 사전
동의어는 검색 기능을 풍부하게 할 수 있게 도와주는 도구 중 하나로 원문에 특정 단어가 존재하지 않더라도 색인 데이터를 토큰화해서 저장할 때 동의어나 유의어에 해당하는 단어를 함께 저장해서 검색이 가능해지게 하는 기술이다.
동의어를 추가하는 방식은 1) 동의어를 매핑 설정 정보에 미리 파라미터로 등록, 2) 특정 파일을 별도로 생성해서 관리하는 방식인데, 1번 방식은 운영 중 변경하기가 어렵기 때문에 사용되지 않는다.
동의어 사전 만들기
- 엘라스틱서치가 설치된 서버 아래 config 디렉터리에 생성해야 한다.
동의어 추가
- 단어를 쉼표(.)로 분리해 등록
- 최신 엘라스틱은 대/소 문자도 자동으로 인식해 동의어를 처리해 준다
동의어 치환
- 특정 단어를 어떤 단어로 변경하고 싶을 때 사용한다.
- 동의어 치환 시, 원본 토큰이 제거되고 변경될 새로운 토큰이 추가
- 동의어 치환은 화살표(=>)로 표시한다.
※참고
동의어 사전은 실시간으로 적용되지 않는다. 수정된 동의어를 적용하고 싶다면 해당 동의어 사전을 사용하고 있는 인덱스를 reload 해야 하는데 이때, 색인 시점/ 검색 시점에 사용될 수 있다
- 색인 시점 사용 시, 사전의 내용이 변경되더라도 색인이 변경되지 않아, 기존 색인을 삭제하고 재생성해야 한다.
- 검색 시점 사용 시, 서전의 내용이 변경되더라도 해당 내용이 반영이 된다.
따라서 검색 시점에 동의어 사전을 사용해서 재색인 없이 변경할 수 있게 해야 한다.
PUT movie_analyzer
{
"settings": {
"index": {
"analysis": {
"analyzer": {
"synonym_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"synonym_filter"
]
}
},
"filter": {
"synonym_filter": {
"type": "synonym",
"ignore_case": true,
"synonyms_path": "analysis/synonym.txt"
}
}
}
}
}
}'Elastic Search' 카테고리의 다른 글
| Ch04. 데이터 검색 - 검색 API (0) | 2025.09.14 |
|---|---|
| Ch03. 데이터 모델링 - Document API 이해하기 (0) | 2025.09.13 |
| Ch03. 데이터 모델링 - 필드 데이터 타입 (0) | 2025.09.07 |
| Ch03. 데이터 모델링 - 메타 필드 (0) | 2025.09.07 |
| Ch03. 데이터 모델링 - 매핑 API (0) | 2025.09.07 |