Elastic Search

[Elasticsearch] 분석기(analyzer)

꾸준함. 2024. 6. 7. 00:41

분석기(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는 이와 비슷한 방법으로 단어들을 역인덱싱하여 도큐먼트를 손쉽게 찾을 수 있음

 

https://kaushik-jeyaraman.medium.com/elasticsearch-search-features-capabilities-20ed99e497ec

 

분석기 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
  • 엘라스틱 개발부터 운영까지 (김준영, 정상운 저)
반응형