엘라스틱서치는 텍스트 분석을 통해 검색하기 쉬운 구조로 텍스트 값을 저장해요.
내가 인덱스를 처음 생성하고 텍스트 타입의 필드 값을 입력하면 엘라스틱서치 분석기는 이 필드 값을 분석하는데 엘라스틱서치에서 분석기는 무엇인지 알아봐요.
엘라스틱서치에서 도큐먼트를 하나 불러와 볼게요. 앞에서 만들었던 해리포터 불사조 기사단을 한 번 불러와볼까요?

_source 필드 안에는 이 도큐먼트를 색인(indexing)할 때 입력했던 값 그대로 들어가 있는 것을 볼 수 있어요. 그런데 이 건 '입력할 때 이렇게 했어.'라고 엘라스틱서치가 우리에게 보여주는 것이고 엘라스틱서치에게 '죽음의 성물을 찾아줘'라고 하면 엘라스틱서치는 이 _source 필드의 값을 보고 우리가 원하는 것을 찾아주는 게 아니라 엘라스틱서치 안에서 내부적으로 '분석된' 값을 가지고 검색 요청에 대한 처리를 해요.
참고로 엘라스틱서치에서의 분석이란 텍스트 분석이에요. 왜냐하면 엘라스틱서치에서 분석하는 필드는 오직 텍스트 타입 필드만 분석하기 때문이에요. keyword 타입의 필드는 다음에 알아봐요.
다시, 엘라스틱서치 분석기는 세개의 파트로 나누어져요.
문자 여과기 (character_filter)
- 캐릭터 필터는 원본 데이터에 글자를 더하고 빼고 바꾸는 역할을 함.
- 애널라이저에는 캐릭터 필터가 하나도 없거나 한 개 이상 있을 수 있음.
- 캐릭터 필터는 지정된 순서대로 원본 (_source 필드에 저장되는) 데이터에 적용됨
토크나이저 (tokenizer - 한글로 뭐라 불러야 할지 모르겠어요 ㅠㅠ)
- 애널라이저는 최소 하나의 토크나이저를 가짐.
- 토크나이저는 텍스트를 토큰으로 나누는 역할을 함.
- 토크나이저에서는 구두점이나 하이픈 따옴표 등과 같은 의미 없는 요소들이 제거됨.
토큰 여과기 (token filter 혹은 filter)
- 애널라이저에는 토큰 필터가 없거나 하나 이상 있을 수 있음.
- 토큰 필터는 지정된 순서대로 토크나이저에서 넘어온 토큰들에 적용됨.
예를 들어 HTML 코드가 원본 데이터로 넘어오게 된다면 <P>, <div>, <a> 등과 같은 elements를 제거하는 html_strip 캐릭터 필터를 거쳐 standard 토크나이저를 지나서 lowercase 토큰 필터를 지나면 html 문서가 어떻게 바뀔지 상상해보세요.
엘라스틱서치에서는 이 애널라이저를 테스트해볼 수 있는 간편한 API가 있어요.
https://www.elastic.co/guide/en/elasticsearch/reference/current/test-analyzer.html
Test an analyzer | Elasticsearch Guide [7.14] | Elastic
The analyze API is an invaluable tool for viewing the terms produced by an analyzer. A built-in analyzer can be specified inline in the request: POST _analyze { "analyzer": "whitespace", "text": "The quick brown fox." } The API returns the following respon
www.elastic.co
앞서 books의 title field에 넣었던 해리포터 시리즈의 제목들을 이 analyze API를 통해서 확인해보아요.
키바나에서 아래와 같이 요청을 작성해봐요.
POST /_analyze
{
"analyzer": "standard",
"text": "Harry Potter and the Chamber of Secrets"
}
POST /_analyze
{
"analyzer": "standard",
"text": "Harry Potter and the Sorcerer's Stone! 234"
}

위에서 보듯이 문장부호 등은 빠지고 띄어쓰기의 공백도 무시되는 것을 볼 수 있어요. 이 것은 전문검색(Full-Text Search)에서 아무 의미 없는 건 그냥 무시되기 때문이에요. 그리고 start_offset, end_offset 등은 원본 문장에서 몇 번째부터 몇번째 까지를 자른- tokenize - 것인지 알려줘요. 그리고 자세히 보니 대문자로 쓴 글씨도 다 소문자로 바뀌어서 들어가 있는 것을 알 수 있어요.
이렇게 위 세 가지 부분들을 손수 직접 작성하거나 이미 만들어져 있는 것을 활용해서 나만의 애널라이저를 만들 수도 있어요. 아래에서 standard analyzer와 같은 효과를 낼 수 있게 각각 char_filter, tokenizer, filter를 구성한 것을 볼게요.
POST /_analyze
{
"text": "She said 'Grab the chest' and, WoW, he did. ",
"char_filter": [],
"tokenizer": "standard"
"filter": ["lowercase"]
}
위 분석기의 필터에서 lowercase를 제거하면 결과가 어떻게 나올까요?
그럼 오늘은 여기까지.