- RDBMS에서는 특정 단어가 들어간 데이터를 검색하려면 like 검색을 해야해서 속도가 느리다. 하지만 엘라스틱서치는 데이터를 저장할 때 루씬기반의 역 인덱스 구조를 만들어 저장하기때문에 검색이 빠르다. 물론 대다수에 문서에 등장하는 단어라면 오히려 더 속도가 떨어 질 수 도 있다(ex) a, the, and 등). 하지만 Elasticsearch에서는 이 단어들을 불용어(stopword)로 등록하고 인덱스에서도 제거하며, 검색어에 등장해도 무시하게 설정이 되어 있다.
- 엘라스틱 서치에서는 이 특정 단어를 Term이라고 부른다. 또한 역 인덱스를 데이터가 저장되는 과정에서 만들기 때문에 데이터를 입력할 때 저장이 아닌 색인을 한다고 표현한다.
- 엘라스틱서치는 문자열 필드가 저장될 때 데이터에서 검색어 토큰을 저장하기 위해 여러 단계의 처리과정을 거친다. 이 전체과정을 텍스트 분석(Text Analysis)라고 하고 이 과정을 처리하는 기능을 애널라이저(Analyzer)라고 한다.
애널라이저는 0~3개의 (1)캐릭터 필터(Character Filter)와 1개의 (2)토크나이저(Tokenizer), 그리고 0~n개의
(3)토큰 필터(Token Filter)로 이루어진다.
(1) 캐릭터 필터는 텍스트 데이터가 입력되면 가장먼저 필요에 따라 전체 문장에서 특정 문자를 대체하거나 제거하는 기능을 한다.
(2) 토크나이저는 문장에 속한 단어들을 Term 단위로 하나씩 분리하며 반드시 1개만 적용이 가능하다. 다음은 whitespace토크나이저를 이용해서 Term을 분리한 결과이다.
(3) 토큰 필터는 분리된 텀들을 하나씩 가공하는데 0 ~ n 개를 적용할 수 있다. 위의 그림에서 lowercase 토큰 필터를 적용시 아래와 같다.
다음은 stop 토큰 필터를 적용한 결과이다. 이는 불용어를 제거하는 필터로, 보통 a ,an, the ,at ,but, for, i, no, to 같은 단어들이 불용어로 간주되어 검색어 토큰에서 제외된다. 이때 불용어는 무조건 소문자만 인식하므로 만약 'The' 를 불용처리하고 싶다면 lowercase 토큰 필터를 적용하여 'the' 로 변환 후 stop 토큰 필터를 적용해야 올바른 결과를 얻을 수 있다.
다음은 형태소 분석을 위한 snowball 토큰 필터를 적용한 결과이다. 이 필터는 ~s, ~ing 등을 제거한다.
마지막으로 동의어를 추가하는 synonym 토큰 필터를 적용한 결과이다. quick 텀에 동의어로 fast를 지정하면 fast로 검색했을 때에도 같은 의미인 quick를 포함하는 도큐먼트가 검색된다.
- 엘라스틱 서치에서는 분석된 문장을 _analyze API를 이용해서 확인할 수 있다. 다음은 "The quick brown fox jumps over the lazy dog" 문장을 whitespace 토크나이저와 lowercase, stop, snowball 토큰 필터를 적용한 결과이다.
- Request
GET _analyze
{
"text": "The quick brown fox jumps over the lazy dog",
"tokenizer": "whitespace",
"filter": [
"lowercase",
"stop",
"snowball"
]
}
- Response
{
"tokens" : [
{
"token" : "quick",
"start_offset" : 4,
"end_offset" : 9,
"type" : "word",
"position" : 1
},
{
"token" : "brown",
"start_offset" : 10,
"end_offset" : 15,
"type" : "word",
"position" : 2
},
{
"token" : "fox",
"start_offset" : 16,
"end_offset" : 19,
"type" : "word",
"position" : 3
},
{
"token" : "jump",
"start_offset" : 20,
"end_offset" : 25,
"type" : "word",
"position" : 4
},
{
"token" : "over",
"start_offset" : 26,
"end_offset" : 30,
"type" : "word",
"position" : 5
},
{
"token" : "lazi",
"start_offset" : 35,
"end_offset" : 39,
"type" : "word",
"position" : 7
},
{
"token" : "dog",
"start_offset" : 40,
"end_offset" : 43,
"type" : "word",
"position" : 8
}
]
}
- 애널라이저의 추가 기능은 아래 링크를 참고하길 바란다.
ref) https://esbook.kimjmin.net/06-text-analysis
'Elasticsearch' 카테고리의 다른 글
Elasticsearch 정리 #1 (기초 개념) (0) | 2022.11.30 |
---|---|
Elasticsearch Query 모음 (0) | 2022.11.15 |