분석기
엘라스틱 서치는 역인덱싱 기술을 통해 전문 검색을 지원한다.
- 이 때 문자열을 나누는 기준이 아주 중요하다.
- 전문 검색: 장문의 문자열에서 부분 검색을 수행하는 것
- 역인덱싱: 장문의 문자열을 분석해 작은 단위로 쪼개어 인덱싱하는 기술
엘라스틱 서치는 이를 지원하기 위해 캐릭터 필터, 토크나이저 tokenizer, 토큰 필터로 구성되어 있는 분석기 모듈을 갖고 있다.
- 분석기에 토크나이저는 반드시 하나가 포함되어야 하고, 캐릭터 필터와 토큰 필터는 옵셥이므로 없어도 되고 여러 개를 함께 사용할 수도 있다.
- 엘라스틱 서치에서 제공하는 분석기를 사용할 수 있고, 필터와 토크나이저 조합을 구성하여 분석기를 커스텀해서 사용할 수도 있다.
토큰과 용어
- 토큰 token: 토크나이저를 이용해 필터링된 문자열을 자르게 되는데, 이 때 잘린 단위를 토큰이라고 지칭한다.
- 용어 term: 토큰들이 복수의 토큰 필터를 거치며 정제된 다음, 최종으로 역인덱스에 저장되는 상태의 토큰들을 말한다.
분석기 구성
구성요소 | 설명 |
---|---|
캐릭터 필터 | 문자열의 전처리 작업, 입력받은 문자열을 변경하거나 불필요한 문자들을 제거한다. |
토크나이저 | 문자열을 토큰으로 분리한다. 분리할 때 토큰의 순서나 시작, 끝 위치도 기록한다. |
토큰 필터 | 분리된 토큰들의 필터 작업(후처리 작업)을 한다. 대소문자 구분, 형태소 분석 등의 작업이 가능하다. |
- 분리된 토큰들은 필터를 거쳐 최종적으로 용어가 되고, 이를 인덱싱해서 전문 검색에 활용하게 된다.
역인덱싱
역인덱스는 색인 페이지와 같다.
- 역인덱스 테이블은 용어가 어떤 문서에 속해 있는지 기록하여 손쉽게 해당 단어가 들어 있는 문서 검색을 수행할 수 있다.
분석기 API
엘라스틱서치는 필터와 토크나이저를 테스트해볼 수 있는 analyze라는 이름의 REST API를 제공하고 있다.
POST _analyze
{
"analyzer": "stop",
"text": "The 10 most loving dog breeds."
}
- stop 분석기는 lowercase 토크나이저와 stop 토큰 필터로 구성되어 있다.
- stop 분석기는 불용어(데이터 집합에 출연하는 빈도는 매우 높지만, 의미가 없는 단어)를 처리한다.
분석기 종류
다양한 분석기가 존재하는데 그 중 자주 사용되는 분석기를 나열해본다.
분석기 | 설명 |
---|---|
standard | 디폴트로 사용되는 분석기, 영문법을 기준으로 한 스탠다드 토크나이저와 소문자 변경 필터, 스톱 필터가 포함 |
simple | 문자만 토큰화, 공백, 숫자, 하이픈(-)이나 작은 따옴표(') 같은 문자는 토큰화하지 않는다. |
whitespace | 공백을 기준으로 구분하여 토큰화 |
stop | simple 분석기와 유사하나 스톱 필터가 포함 |
토크나이저
분석기는 반드시 하나의 토크나이저를 포함해야 한다. 토크나이저는 문자열을 분리해 토큰화하는 역할을 한다.
반드시 포함되는 요소이므로 형태에 맞는 토크나이저 선택이 중요하다.
토크나이저 | 설명 |
---|---|
standard | 스탠다드 분석기가 사용하는 토크나이저, 디폴트로 사용된다. 쉼표(,), 점(.) 같은 기호를 제거하고 텍스트 기반으로 토큰화 |
lowercase | 모든 문자를 소문자로 변경해 텍스트 기반으로 토큰화 |
ngram | 원문으로부터 N개의 연속된 글자 단위를 모두 토큰화, 원문으로부터 검색할 수 있는 거의 모든 조합을 얻어낼 수 있기 때문에 정밀한 부분 검색에 강점을 가진다. 그러나 토크나이징을 수행한 N개 이하의 글자 수로는 검색이 불가능하며 저장공간을 많이 차지한다는 단점 예) '엘라스틱서치' 를 2gram으로 토큰화 한 결과 -> [엘라, 라스, 스틱, 틱서, 서치]와 같이 연속된 두 글자를 모두 추출 |
uax_url_email | 스탠다드 토크나이저와 유사하나 URL이나 이메일을 토큰화하는 데 강점 |
분석기와 마찬가지로 토크나이저를 테스트 해 볼 수 있다.
POST _analyze { "tokenizer": "uax_url_email", "text": "email: elastic@elk-company.com" }
필터
분석기에 필터는 옵션으로, 없어도 되고 하나 이상을 포함할 수 있다.
- 필터 역시 analyze API를 이용해 테스트해볼 수 있다.
- 필터는 단독으로 사용할 수 없고, 반드시 토크나이저가 있어야 한다.
POST _analyze
{
"tokenizer": "standard",
"filter": ["uppercase"],
"text": "The 10 most loving dog breeds."
}
- 필터는 [] 배열 안에 여러 개를 적을 수 있고, 필터가 여러 개면 작성된 순서대로 적용된다.
캐릭터 필터
토크나이저 전에 위치하며 문자들을 전처리하는 역할을 한다.
- HTML 문법을 제거/변경하거나 특정 문자가 왔을 때 다른 문자로 대체하는 일들을 한다.
- 엘라스틱서치가 제공하는 분석기들은 대부분 캐릭터 필터를 포함하지 않으므로, 필요하다면 커스텀 분석기를 만들어 사용한다.
토큰 필터
토크나이저에 의해 토큰화되어 있는 문자들에 필터를 적용한다. 즉 토큰들을 변경하거나 삭제하고 추가하는 작업들이 가능하다.
종류가 아주 많고 자주 변경되는 요소이므로 자주 사용되는 토큰 필터 몇 가지만 나열한다.
필터 | 설명 |
---|---|
lowercase | 모든 문자를 소문자로 변환 |
stemmer | 영어 문법을 분석하는 필터, 형태소를 분석해 어간을 분석하는 필터, 한글의 경우 아리랑, 노리 같은 오픈소스가 존재함 |
stop | 기본 필터에서 제거하지 못하는 특정한 단어를 제거 |
커스텀 분석기
사용자가 직접 토크나이저, 필터 등을 조합해 사용할 수 있는 분석기이다.
설정
인덱스에 커스텀 분석기를 등록하여 생성할 수 있다.
PUT test_analyzer { "settings": { "analysis": { "filter": { "my_stopwords": { "type": "stop", "stopwords": ["lions", "My"] } }, "analyzer":{ "my_analyzer": { "type": "custom", "char_filter": [], "tokenizer": "standard", "filter": ["lowercase", "my_stopwords"] } } } } }
인덱스 설정 settings에 analysis 파라미터를 추가하고 analysis 파라미터 밑에 필터(filter)와 분석기(analyzer)를 만든다.
분석기에는 반드시 토크나이저가 하나 들어가야 한다.
커스텀 분석기나 커스텀 필터는 설정된된 인덱스 내에서만 유효하다.
GET test_analyzer/_analyze { "analyzer": "my_analyzer", "text": "Cats Lions Dogs" }
분석기 API를 이용해 커스텀 분석기를 통해 문자열을 분석하는 요청을 보낸다.
필터 적용 순서
커스텀 분석기에 필터를 여러 개 사용하는 경우, 필터의 순서에 주의를 기울일 필요가 있다.
GET test_analyzer/_analyze { "tokenizer": "standard", "filter": ["lowercase", "my_stopwords"], "text": "My Cats Lions Dogs" }
필터는 제시된 배열의 첫 번째 순서부터 적용되는데, 순서가 잘못되면 원했던 결과가 제대로 나오지 않을 수 있다.
- 예를 들어 필터에서 "My" 라는 용어를 제외하도록 설정해두었는데 해당 필터 앞에 lowercase 필터가 위치하게 되면, "My"는 "my" 가 되어서 제외되지 않고 인덱싱이 된다.
- 가능하면 모든 문자를 소문자로 변환한 후에 필터를 적용하는 것이 실수를 줄일 수 있는 방법이다.
참고 자료
'Infra > DB' 카테고리의 다른 글
[Elasticsearch]기초 알아가기 02. (0) | 2025.06.18 |
---|---|
[Elasticsearch]기초 알아가기 01. (0) | 2025.06.17 |
몽고DB 구성(Replica Set/Sharded Cluster) 간단히 알아보기 (0) | 2025.05.31 |
[MongoDB]몽고디비 개요 (0) | 2025.05.28 |
[Redis]Sentinel 구성 실습(Docker 활용) (1) | 2025.05.26 |