분석기(analyzer)
- 문서의 내용은 분석기에 의해 처리되고 생성된 토큰으로 검색
- 어떤 분석기를 사용할지와 분석기의 실행 순서가 중요
- 너무 많은 분석을 하면 색인 성능 저하
- 색인과 검색의 분석기는 가급적 같은 tokenizer를 사용하는 것이 바람직
- 경우에 따라 색인과 검색에 다른 분석기를 사용하는 케이스가 있음
- 특정 검색어로 인해 더 많은 단어를 필터링해야 하는 경우
- 동의어, 맞춤법 교정 등으로 검색어를 확장하는 경우
1. 분석기 종류
- Elasticsearch는 다양한 분석기를 제공하며 버전에 따라 변경이 많으므로 분석기도 버전에 따라 변화가 많음
- 자주 사용되는 분석기는 다음과 같으며 각 예제는 "The 10 most loving dog breeds" 문자열이 input으로 들어왔을 때 결과
자주 사용되는 분석기 | 설명 |
standard | 특별한 설정이 없으면 Elasticsearch가 기본적으로 사용하는 분석기 영문법을 기준으로 한 스탠다드 토크나이저와 소문자 변경 필터, 스톱 필터가 포함되어 있음 ex) [the, 10, most, loving, dog, breeds] |
simple | 문자만 토큰화 공백, 숫자, 하이픈(-)이나 작은 따옴표(')와 같은 문자는 토큰화하지 않음 ex) [the, most, loving, dog, breeds] |
whitespace | 공백을 기준으로 구분하여 토큰화 함 ex) [the, 10, most, loving, dog, breeds] |
stop | simple 분석기와 비슷하지만 스톱 필터가 포함되어 있음 스톱 필터에 의해 a, an, the와 같은 불용어 제거됨 ex) [most, loving, dog, breeds] |
* 자주 사용되는 한국어 분석기는 후술 할 nori가 있음
분석기 구성요소
- Full text 검색을 위해 문장을 토큰화하여 검색 시 매칭될 수 있도록 분석하는 과정
- 캐릭터 필터, 토크나이저, 토큰 필터로 구성
- 분석기에는 하나의 토크나이저가 반드시 포함돼야 하며, 캐릭터 필터와 토큰 필터는 옵션이므로 없어도 되고 여러 개를 함께 사용해도 됨
- 사용자는 Elasticsearch에서 제공하는 분석기를 사용하거나 필터와 토크나이저를 조합하여 직접 커스터마이징하여 사용하기도 함
1. 캐릭터 필터(character filters)
- 토크나이저 전에 위치하며 원본 텍스트를 전처리하는 역할
- 입력받은 문자열을 변경하거나 불필요한 문자들을 제거
- Elasticsearch가 제공하는 대부분의 분석기는 캐릭터 필터가 포함되어 있지 않기 때문에 캐릭터 필터를 사용하기 위해서는 커스텀 분석기를 만들어 사용하는 것을 권장
- 기본적으로 html_strip, mapping, pattern_replace를 제공
2. 토크나이저(tokenizer)
- 캐릭터 필터에서 변형된 텍스트를 특정 규칙에 맞게 토큰으로 분할
- 분할할 때 토큰의 순서나 시작, 끝 위치도 기록
- 분석기 구성 시 한 개만 사용 가능하며 반드시 포함돼야 하기 때문에 형태에 맞는 토크나이저 선택이 중요
- 대표적인 토크나이저 종류는 다음과 같음
토크나이저 | 설명 |
standard | 스탠다드 분석기가 사용하는 토크나이저로 특별한 설정이 없으면 기본 토크나이저로 사용됨 쉼표(,)나 점(.) 같은 기호를 제거하며 텍스트 기반으로 토큰화 |
lowercase | 텍스트 기반으로 토큰화하며 모든 문자를 소문자로 변경해 토큰화 |
ngram | 원문으로부터 N개의 연속된 글자 단위를 모두 토큰화 예를 들어 '엘라스틱서치'라는 원문을 2gram으로 토큰화하면 [엘라, 라스, 스틱, 틱서, 서치]와 같이 연속된 두 글자를 모두 추출 사실상 원문으로부터 검색할 수 있는 거의 모든 조합을 얻어낼 수 있기 때문에 정밀한 부분 검색에 강점이 있지만 토크나이징을 수행한 N개 이하의 글자 수로는 검색이 불가능하며 모든 조합을 추출하기 때문에 저장 공간을 많이 차지한다는 단점 존재 |
uax_url_email | standard 분석기와 비슷하지만 URL이나 이메일을 토큰화하는데 강점이 있음 |
3. 토큰 필터(token filters)
- 토크나이저에서 분할된 토큰들을 개별적으로 문자를 추가, 수정, 삭제하는 필터
- 대소문자 구분, 형태소 분석 등의 작업이 가능
- 배열로 여러 개의 필터를 사용할 수 있음
- 자주 사용하는 토큰 필터는 다음과 같음
토큰 필터 | 설명 |
lowercase | 모든 문자를 소문자로 변환 반대로 모든 문자를 대문자로 변환하는 uppercase 필터도 존재 |
stemmer | 영어 문법을 분석하는 필터 언어마다 고유한 문법이 있어서 필터 하나로 모든 언어에 대응하기는 힘듦 'loving', 'loved'는 'love'와 같은 어간, 'breeds'는 'breed'와 같은 어간 한글의 경우 아리랑, 노리 같은 오픈소스가 있음 |
stop | 기본 필터에서 제거하지 못하는 특정한 단어를 제거할 수 있음 영어를 기반으로 하여 동작하기 때문에 한글에서는 잘 동작하지 않음 |
토큰(token) vs 용어(term)
- 분석기는 먼저 캐릭터 필터를 통해 원문에서 불필요한 문자들을 제거
- 이후 분석기는 토크나이저를 이용해 필터링된 문자열을 자르게 되는데, 이때 잘린 단위를 토큰이라고 지칭
- 이러한 토큰들은 복수의 토큰 필터를 거치며 정제되는데, 정제 후 최종으로 역인덱스에 저장되는 상태의 토큰들을 용어(term)라고 함
- 인덱싱되어 있는 단위, 또 검색에 사용되는 단위는 모두 용어
한국어 분석기 - nori
대표적인 한국어 분석기로 일본어 형태소 분석기인 kuromoji를 기반으로 개발된 nori가 있음
- nori는 기본패키지가 아니기 때문에 사용하기 전 설치 필요
- bin/elasticsearch-plugin install analysis-nori
1. nori 구성요소
- 토크나이저: nori_tokenizer
- 토큰 필터: nori_part_of_speech, nori_readingform, nori_number
1.1 nori-tokenizer
- 한국어 형태소 분석기
- 형태소를 분석하는 분석기가 아닌 기본 분석기를 사용할 경우 복합명사를 분해할 수 없음
- 서울대학교 -> [서울, 대학교], [서울대, 학교]
옵션정보 | default 값 | 설명 |
user_dictionary | 사용자 사전 파일 설정 및 단일명사, 복합명사 등록 기본폴더 위치는 $ES_HOME/config/[파일명].txt로 만들어 사전을 한줄에 하나씩 처리 |
|
user_dictionary_rules | 인덱스 세팅에서 단일명사, 복합명사를 등록하여 관리 | |
decompound_mode | discard | 복합명사를 처리할 때 원 단어를 같이 색인할지 여부를 결정 옵션: none(복합명사를 분해하지 않음) 옵션: discard(복합명사를 분해하고 원단어 삭제) 옵션: mixed(복합명사를 분해한 단어와 원본 단어를 모두 유지) |
discard_punctuation | true | 구두점(쉼표, 마침표)을 삭제할지 여부 |
1.2 nori_part_of_speech
- 형태소 분석 후 불필요한 품사 태그를 지정하여 삭제
- 품사 태그 목록
1.3 nori_readingform
- 한자를 한글로 변환하는 필터
- 상황에 따라 추가/삭제
- 잘 사용하지는 않지만 도메인에 맞게 추가하여 사용
- ex) 신문 검색, 논문 검색 등
1.4 nori_number
- 한글로 된 숫자를 숫자로 변환
- 상황에 따라 추가/삭제
- 정규화 예제
- ex) 영영칠 -> 7
- ex) 삼천2백2십삼 -> 3223
- ex) 3.2천 -> 3200
- ex) 4,647.100 -> 4647.1
- ex) 15,8 -> 158 (주의해야 할 약점)
역인덱싱
- 분석기는 문자열을 토큰화하고 이를 인덱싱하는데 이를 역인덱싱이라고 지칭
- 전공서적 같은 두꺼운 책 뒤편에 있는 appendix가 역인덱싱이라고 생각하면 이해하기 쉬움
- 많이 쓰는 단어들을 선별해 해당 단어가 몇 페이지에 나와 있는지 알려주는 것을 색인이라고 함
- Elasticsearch는 이와 비슷한 방법으로 단어들을 역인덱싱하여 도큐먼트를 손쉽게 찾을 수 있음
분석기 api
- POST _analyze
- 필터와 토크나이저를 테스트하기 위해 API로 제공
- analyzer, field, character filter, tokenizer, filter 항목의 분석결과를 볼 수 있음
1. _analyze api 파라미터
파라미터 | default 값 | 설명 |
analyzer | 인덱스명을 지정하여 api 호출 시 세팅에 정의된 분석기를 지정하여 분석 가능 기본적인 내장 분석기(standard analyzer)도 분석 가능 |
|
char_filter | tokenizer를 분석하기 전 문자를 전처리하여 나온 결과를 확인 가능 | |
explain | false | 분석 결과의 과정 전체를 확인 |
field | 인덱스명에 매핑된 필드명에 지정된 분석기의 분석 | |
filter | tokenizer로 분석된 결과에서 filter로 지정된 분석기의 분석 | |
normalizer | 필드 데이터 타입이 keyword인 항목의 테스트 변형을 위한 분석기로 변형된 결과 확인 | |
tokenizer | 텍스트를 특정 규칙에 따라 토큰으로 분할한 결과 확인 |
동의어/불용어 등 사전 방식의 데이터처리 방법
1. 동의어 처리
- 같은 의미의 다른 단어를 동의어로 처리
- ex) 4WD, 4륜
- 유의어, 동의어, 별명은 Elasticsearch의 토큰 필터로 처리 가능
- 유의어, 동의어, 별명의 처리는 모두 동의어
- 한국어 분석기와 함께 분석기로 구성하여 동의어를 처리
- 색인 타임, 검색 타임 둘 다에서 사용이 가능하고 각각의 장단점이 존재하지만 색인 타임에 동의어 분석기를 지정하는 것이 유리
색인 시 동의어 처리 | 검색 시 동의어 처리 |
모든 동의어 색인으로 용량이 커짐 동의어 반영 시 재색인 진행 검색 시 리소스를 적게 사용 분석기 테스트 시 정확하게 동의어 반영 여부 확인 가능 |
동의어를 즉각적으로 반영 동의어를 잘 못 등록하면 여러 개의 단어가 체이닝 될 수 있음 시스템의 리소스 소모가 심함 |
부연 설명
- 색인 시에는 standard 분석기 적용
- 검색 시 동의어 처리
2. 동의어 사전 구성
- 동의어를 구성하는 방법은 두 가지가 존재
- 단어 동등 관계
- 단어 치환 단계
단어 동등 관계 | 단어 치환 단계 |
A, B: A나 B를 검색해도 결과 노출 | 색인 타임 시 A -> B: A를 B로 치환하여 저장하므로 검색 시 A를 검색하면 검색되지 않음 검색 타임 시 A -> B: A -> B로 치환하면, A로 저장된 문서는 검색되지 않음 |
3. 동의어 사전 저장
- 동의어 사전은 Elasticsearch 노드의 config 폴더 하위에 동의어 사전으로 생성
- 동의어 사전을 reload하기 위한 API 존재
- POST [인덱스]/_reload_search_analyzers
- 검색 타임 시에만 리로드가 가능하며 리로드 후 캐시를 지워줘야 정상 반영 확인 가능
- POST [인덱스]/_cache/claer?request=true
3.1 동의어 사전 저장 방식
- 각각의 내용을 한 줄에 입력하여 txt 파일로 저장
- 다음 예제는 동등 방식
3.2 동의어 사전 분석
4. 불용어 처리
- 검색의 대상에서 제외하는 단어 등록
- Elasticsearch 노드의 config 폴더 하위에 불용어 사전 파일 생성
- 보통 욕설, 검색되지 말아야 하는 단어, 의미가 없는 단어들을 등록하고 검색에서 제외
- 검색 타임에도 사전을 리로드 하여 즉각 반영하게 구성
- 사전 리로드 하는 API 존재
- POST [인덱스명]/_reload_search_analyzers
- 캐시 삭제하는 API
- POST [인덱스명]/_cache/clear?request=true
5. 불용어 사전 저장 방식
- 각각의 내용을 한 줄에 입력하여 txt 파일로 저장
5.1 불용어 사전 분석
6. 사용자 사전 처리
- 단일명사 혹은 복합명사를 검색하기 위해 사용자가 사전 등록
- nori 분석기를 사용하여 키워드 분석
- 사용자 사전을 사용하기 위해 Elasticsearch 노드의 config 폴더 하위에 사용자 사전 생성
- 사용자 사전 저장할 때 각각의 내용을 한 줄에 입력하여 txt 파일로 저장
6.1 사용자 사전 구축 - 인덱스 세팅
- 사용자 사전 추가 시 userdic_ko.txt 파일 추가 (파일은 미리 추가되어 있어야 함)
- analyzer에서 tokenizer로 nori_tokenizer의 이름으로 추가하여 사용
6.2 한국어 분석기 구성 테스트
- _analyze API를 사용하여 분석기 분석
참고
- 패스트 캠퍼스 - 고성능 검색 엔진 구축으로 한 번에 끝내는 Elasticsearch
- 엘라스틱 개발부터 운영까지 (김준영, 정상운 저)
반응형
'Elastic Search' 카테고리의 다른 글
[Elasticsearch] 집계 (3) | 2024.06.09 |
---|---|
[Elasticsearch] 검색 (0) | 2024.06.07 |
[Elasticsearch] 매핑과 인덱스 alias, template (1) | 2024.06.06 |
[Elasticsearch] 데이터 모델링 기초 (0) | 2024.06.06 |
[Elasticsearch] 개념과 용어 정리 (1) | 2024.06.02 |