Elasticsearch 분석기 개요
엘라스틱서치 분석기
여기서는 올바른 검색환경 구성을 위한 분석기 구성 방법과 어떻게 사용하는 지에 대해 다룹니다.
3.4.1 텍스트 분석 개요
// 쿼리 POST _analyze { "analyzer": "standard", "text": "this is kimgn test" } // 결과 { "tokens" : [ { "token" : "this", "start_offset" : 0, "end_offset" : 4, "type" : "<ALPHANUM>", "position" : 0 }, { "token" : "is", "start_offset" : 5, "end_offset" : 7, "type" : "<ALPHANUM>", "position" : 1 }, { "token" : "kimgn", "start_offset" : 8, "end_offset" : 13, "type" : "<ALPHANUM>", "position" : 2 }, { "token" : "test", "start_offset" : 14, "end_offset" : 18, "type" : "<ALPHANUM>", "position" : 3 } ] } |
"this is kimgn test" 위 테스트 문장에서 "kimg"를 검색하려고 한다면? 검색되지 않는다!
이유 : 지금 나뉘어진 토큰 안에서는 "kimgn"은 존재해도 "kimg" 는 존재하지 않기 때문
POST kimgn_test_2/_doc/1 { "text": "this is kimgn test"} GET kimgn_test_2/_search { "from": 0, "query":{ "term": { "text": "kimg" } } } GET kimgn_test_2/_search { "from": 0, "query":{ "term": { "text": "kimgn" } } } |
역색인 구조란?
아래와 같은 저장 구조로써, 위처럼 토큰을 문서로 저장하여 문서상의 위치와 출현 빈도 등을 체크하여 저장한다.
일반적인 RDB의 검색구조
Elasticsearch의 역색인 구조
ES의 색인한다는 말 : 역색인 파일을 만든다는 뜻으로, 색인 파일에 들어갈 토큰만 변경되어 저장되고, 실제 문서의 내용은 변함없이 저장됨.
3.4.3 분석기의 구조
분석기의 동작 프로세스
- 문장을 특정한 규칙에 의해 수정한다. → CHARACTER FILETER ( HTML 태그를 지우거나, 특정한 단어를 변경하는 역할을 하는 필터)
- 수정한 문장을 개별 토큰으로 분리한다. → TOKENIZER FILETER (분석기 구성시 하나만 사용할 수 있으며, 텍스트를 어떻게 나눌 것인지 정의한다. )
- 개별 토큰을 특정한 규칙에 의해 변경한다. → 토큰화된 단어를 필터링해 사용자가 원하는 토큰으로 변환한다.
# 분석기를 이용한 분석 방법 POST _analyze { "analyzer": "standard" , "text": ["test"] } # 기존 필드를 이용한 분석 방법 POST portdata/_analyze { "field": "banner.ngram" , "text": ["test"] } |
색인과 검색시 분석기를 각각 사용.
색인시 사용하는 Index Analyzer와 검색시 사용되는 Search Analyzer를 구분해서 사용할 수 있다. 인덱스 생성시 색인용, 검색용 분석기를 각각 정의하고, 적용하고자 하는 필드에 원하는 분석기를 지정할 수 있다.
PUT movie_analyzer { "settings": { "analysis": { "analyzer": { "movie_lower_test_analyzer":{ "type":"custom", "tokenizer":"standard", "filter": [ "lowercase" ] }, "movie_stop_test_alalyzer":{ "type":"custom", "tokenizer":"standard", "filter" :[ "lowercase", "english_stop" ] } }, "filter": { "english_stop":{ "type":"stop", "stopwords":"_english_" } } } }, "mappings": { "_doc":{ "properties":{ "title": { "type":"text", "analyzer":"movie_stop_test_alalyzer", "search_analyzer":"movie_lower_test_analyzer" } } } } } PUT movie_analyzer/_doc/1 { "title": "Harry Potter and the Chamber of Secrets" } POST movie_analyzer/_analyze { "field": "title", "text": "Harry Potter and the Chamber of Secrets" } # AND 와 OR의 검색 차이를 보자 POST movie_analyzer/_search { "query": { "query_string": { "default_operator": "AND", "query": "Chamber of secrets" } } } |
3.4.3.2 대표적인 분석기
- Standard Analyzer : 가장 기본적인 분석기로, 공백 혹은 특수기호로 토큰을 분리하고, 모든 문자를 소문자로 분리하는 토큰 필터를 사용하며, (이부터는 관계자 피셜 : 자사의 특정한 알고리즘을 통해 토크나이징을 해서 가장 추천한다고 합니다.)
- Whitespace Analyzer : 공백 문자열을 기준으로 토큰을 분리하는 분석기
- Keyword Analyzer : 전체 입력 문자열을 하나의 키워드처럼 관리한다(토큰화 작업을 하지 않는다 → 집계에 가장 많이 사용하느느 토크나이저)
3.4.4 전처리 필터
Document에 들어오는 문장을 미리 데이터 정제하는 것으로, 기본적으로 HTML 태그가 있음
PUT movie_analyzer_chartest { "settings": { "analysis": { "analyzer": { "html_strip_analyzer":{ "tokenizer":"standard", "char_filter": [ "html_strip_char_filter" ] } }, "char_filter": { "html_strip_char_filter":{ "type":"html_strip", "escaped_tags":["b"] } } } }, "mappings": { "_doc":{ "properties":{ "title": { "type":"text", "analyzer":"html_strip_analyzer" } } } } } POST movie_analyzer_chartest/_analyze { "field": "title", "text":"<span> Harry Potter</span> and the <b>Chamber</b> of Secrets" } GET movie_analyzer_chartest/_doc/1 # span으로 검색시 검색이 안됨! GET movie_analyzer_chartest/_search { "from": 0, "query":{ "term": { "title": "span" } } } |
출처 : 엘라스틱서치 실무 가이드, 엘라스틱서치 공식 홈페이지 블로그