CHARACTER FILTER 텍스트를 개별 토큰화하기 전의 전처리 과정, 문장을 특정한 규칙에 의해 수정한다 문장을 분석하기 전에 입력 텍스트에 대해 특정한 단어를 변경하거나 HTML과 같은 태그를 제거하는 등, 사용자가 정의한 필터를 적용할 수 있다.
TOKENIZER FILTER 수정한 문장을 개별 토큰으로 분리한다. 언어별로 전용 형태소 분석기의 Tokenizer를 사용한다.
TOKEN FILTER 토큰화된 단어를 하나씩 필터링해서 사용자가 원하는 토큰으로 변환한다. 불용어를 제거, 동의어 사전의 단어 추가, 대문자를 소문자로 변환 등의 작업을 수행할 수 있다. Token Filter는 여러 단계가 순차적으로 이뤄지며 순서에 따라 검색의 질이 달라질 수 있다.
예시로 아래와 같은 문자열이 text 필드로 입력되면 아래 테이블과 같이 색인이 이루어진다.
1 2
1. elasticsearch is cool 2. <B>Elasticsearch<B> is great
토큰
문서번호
텀의 위치 (Position)
텀의 빈도 (Term Frequency)
elasticsearch
문서1,문서2
1,1
2
is
문서1,문서2
2,2
2
cool
문서1
3
1
great
문서2
3
1
문서가 저장되면 분석기는 색인처리를 진행한다. 여기서 색인 과정은 아래 4가지 과정을 뜻한다.
모든 문서가 가지는 단어의 고유 단어 목록
해당 단어가 어떤 문서에 속해 있는지에 대한 정보
전체 문서에 각 단어가 몇 개 들어있는지에 대한 정보
하나의 문서에 단어가 몇 번씩 출현했는지에 대한 빈도
인덱스 생성시 색인할 때 사용되는 Index Analyzer 와 검색할 때 사용되는 Search Analyzer 로 구분하여 지정할 수 있다.
movie_stop_test_analyzer 분석기의 경우 english_stop 필터를 사용하는데 불용어를 제거한다.
만약 아래와 같이 토큰화를 진행할 경우 불용어를 제외한 4개의 단어가 토큰으로 저장된다.
1 2 3 4
PUT movie_analyzer/_doc/1 { "title":"Harry Potter and the Chamber of Secrets" }
1
[harry], [potter], [chamber], [secrets]
검색의 경우 movie_lower_test_analyzer 를 사용하는데 아래와 같이 요청할 경우 소문자로 토큰화 되어 요청하게될 것이다.
1 2 3 4 5 6 7 8
POST movie_analyzer/_search { "query":{ "query_string":{ "query":"Chamber of Secrets" } } }
1
[chamber], [of], [secrets]
기본적으로 토큰 데이터는 OR 조건으로 묶여있어 3개중 하나의 토큰만 찾을 수 있으면 검색이 되지만 만약 query 를 AND 조건으로 진행할 경우 위 of 토큰이 껴있기 때문에 Harry Potter and the Chamber of Secrets 문서는 검색되지 않는다.
POST movie_html_analyzer/_analyze { "analyzer":"html_strip_analyzer", "text":"<span>Harry Potter</span> and the <b>Chamber</b> of Secrets" }
// result { "tokens":[ { "token":"Harry Potter and the <b>Chamber</b> of Secrets", "start_offset":6, "end_offset":59, "type":"word", "position":0 } ] }
escaped_tags 에 설정한 대로 <b> 태그 외의 모든 HTML태그가 제거되었다.
tokenizer(토크나이저)
분석기를 구성하는 가장 핵심 구성요소로 어떠한 토크나이저를 사용하느냐에 따라 분석기의 전체적인 성격이 결정된다.
tokenizer 키워드를 사용해 분석기에서 사용하는 토크나이저를 지정한다.
standard
엘라스틱서치에서 일반적으로 사용하는 토크나이저로서 대부분의 기호를 만나면 토큰으로 나눈다
1 2 3 4 5
POST movie_analyzer/_analyze { "tokenizer":"standard", "text":"Harry Potter and the Chamber of Secrets" }
1
[Harry, Potter, and, the, Chamber, of, Secrets]
whitespace
공백을 만나면 토큰으로 나눈다.
1 2 3 4 5
POST movie_analyzer/_analyze { "tokenizer":"whitespace", "text":"Harry Potter and the Chamber of Secrets" }
keyword
텍스트 전체를 하나의 토큰으로 생성.
1 2 3 4 5
POST movie_analyzer/_analyze { "tokenizer":"keyword", "text":"Harry Potter and the Chamber of Secrets" }
POST movie_syno_analyzer/_analyze { "analyzer":"synonym_analyzer", "text":"Harry Potter and the Chamber of Secrets" }
화살표는 치환되고 컴파는 추가된다.
1
[해리, Potter, and, the Chamber, of, Secrets, 비밀]
현업에선 synonyms_path 설정을 통해 직접 동의어사전을 만들어 운영하는 편이다.
동의어 사전을 수정하면 실시간으로 분석기에 적용될것이라 예상하지만 그렇지 않다.
synonym_filter 를 사용하는 분석기는 색인시점과 검색시점에 사용될 수 있다. 검색시점 분석기에는 실시간 적용이 되지만 색인시점 분석기에 적용하려면 reload 를 해야한다. 그리고 이미 old 동의어 사전 색인된 문서들은 색인을 재생성하지 않는 이상 그대로 남아있게 된다.
그래서 synonym_filter 를 사용한 분석기는 검색분석기로 많이 사용한다.
ngram, edge_ngram
ngram, edge_ngram 토크나이저도 있지만 토큰필터에서도 해당 역할을 수행할 수 있다. 하지만 tokenizer 에는 없는기능이 하나 있는데 side 옵션이다.