본문 바로가기
👩‍💻TIL/엘라스틱서치

[Elasticsearch] 엘라스틱 서치 분석기 구조

by devuna 2020. 3. 27.
728x90

[Elasticsearch] 엘라스틱 서치 분석기 구조

엘라스틱서치를 공부하며 알게 된 내용들을 꾸준히 정리해보려고 합니다.

이번 글은 엘라스틱 서치 공식reference를 바탕으로 정리하였습니다.

https://www.elastic.co/guide/en/elasticsearch/reference/current/analyzer-anatomy.html

 

먼저, 엘라스틱서치는 루씬기반의 텍스트 검색엔진 라이브러리입니다. 사전 매핑 없이 JSON 문서 형식으로 입력하면 별도의 이벤트가 없어도 바로 색인을 시작하며, 이렇게 저장된 데이터는 별도의 갱신 없이도 바로 검색에 사용될 수 있습니다.

이는 곧 색인 작업이 완료됨과 동시에 검색이 가능하다는 걸 의미합니다.

💡 분석기(analyzar)란? 

엘라스틱서치는 아주 뛰어난 검색엔진이지만

원하는 조건에 맞는 검색결과를 출력하기 위해서는 검색 값을 정제하는 과정이 필요합니다.

주로 많이 쓰이는 것들은 한글 형태소 분석기(예를 들어, nori..)와 같은 언어의 규칙을 바탕으로 분석기(Analyzer)들입니다.

 

이러한 분석기가 필요한 이유는 역색인(Inverted Index) 방식으로 검색을 수행하는 엘라스틱서치의 특성 때문입니다.

역 색인 방식이란, 책의 앞쪽 목차가 아닌, 책의 뒤쪽 찾아보기와 같이 

단어 별로 해당 데이터가 들어간 페이지가 정리되어 있는 방식을 말합니다. 

 

이러한 역색인 검색을 수행하기 위해서는

데이터가 들어오면

1. Tokenizer : 해당 단어(term 또는 token)를 분리하는 작업을 수행한 뒤,

2. Token Filter : 분리된 단어들을 검색 가능하도록(searchable) 가공하는 작업을 수행하는

두 가지 작업이 필요하며, 이 둘을 합친 것이 바로 분석기(Analyzer)입니다.

 

💡 Tokenizer 

- Tokenizer정해진 separator (예를 들어, 공백,.(온점) , /(슬래시) 등의 특수문자)을 기준으로 토큰을 분리합니다.

예를 들어,  엘라스틱서치에서 제공하는 whitespace Tokenizer는 공백이 보일 때마다 텍스트를 토큰으로 나눕니다.  

Quick brown fox! 👉  [Quick, brown, fox!]   
POST _analyze
{
  "tokenizer": "whitespace",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}

 

위와 같이 데이터를 보내면, 아래와 같이 생성합니다.

[ The, 2, QUICK, Brown-Foxes, jumped, over, the, lazy, dog's, bone. ]

 

 

- 각 단어의 순서, 해당 단어의 시작과 끝자리의 offset을 기록합니다.

- 그리고, 분석기에는 반드시 하나 이상의 토크 나이저가 있어야 합니다.

- 엘라스틱서치에서 제공하는 토크 나이저들의 목록은 아래 링크를 참고해주세요!

https://www.elastic.co/guide/en/elasticsearch/reference/7.x/analysis-tokenizers.html

 

 

💡 Token Filter

- Token Filter는 Tokenizer로 분리된 토큰들을 가공하는 역할을 합니다. 

- 'filters'라는 매개변수를 통해 지정할 수 있으며, 대표적으로 들어온 문자를 소문 자화 시켜주는 lowercase토큰, 불필요한 일반 단어들을 제거하는 stop토큰 필터, 동의어를 추가하는 synonym 토큰필터 등이 있습니다.

 

GET _analyze
{
  "tokenizer" : "standard",
  "filter" : ["lowercase"],
  "text" : "THE Quick FoX JUMPs"
}

 

위와 같은 데이터는 아래와 같이 가공됩니다.

[ the, quick, fox, jumps ]

 

 

분석기를 추가하는 방법은 아래와 같습니다.

PUT lowercase_example
{
    "settings" : {
        "analysis" : {
            "analyzer" : {
                "whitespace_lowercase" : {
                    "tokenizer" : "whitespace",
                    "filter" : ["lowercase"]
                }
            }
        }
    }
}

- 토큰 필터는 각 토큰의 위치 또는 문자 오프셋을 변경할 수 없습니다. (가공만 합니다!)

- 분석기에는 0 개 이상의 토큰 필터가 있을 수 있으며여러 개가 있을 경우, 순서대로 적용됩니다.

 

 

 

 

 

728x90

댓글