-
ES - 텍스트 분석🔍 elastic search 2022. 9. 22. 13:53
역색인 구조
Elasticsearch는 역색인 구조를 사용해 데이터를 빠르게 검색할 수 있다.
- 각 문서의 text를 term으로 분할하고, term 들을 도큐먼트와 매핑
- 특정 키워드(term)로 포함하고 있는 문서들에 대한 Primary Key를 맵핑하는 인덱스 테이블 생성
인덱스 테이블을 활용하여 빠른 문서 탐색이 가능하다.
- 주로 BTree, Trie, Hash Table 등의 자료구조를 활용하여 구현
단점
- 영어의 경우 대소문자를 다른 텍스트로 인지한다.
- 복수형과 단수형이 동일하게 검색되지 않는다.
- jump, leap는 같은 의미지만 다른 텍스트로 인지
→ 텍스트 분석을 통해 해결
텍스트 분석
Elasticsearch는 문자열 필드가 저장될 때 데이터에서 검색어 토큰을 저장하기 위해 여러 단계의 처리 과정을 거침.
- 이를 텍스트 분석(Text Analysis)라고 한다.
- 이 과정을 처리하는 기능을 애널라이저(Analyzer)라고 한다.
애널라이저는 0-3개의 캐릭터 필터(Character Filter) 와 1개의 토크나이저(Tokenizer), 그리고 0~n개의 토큰 필터(Token Filter)로 이루어진다.
캐릭터 필터
- 텍스트 데이터가 입력되면 가장 먼저 필요에 따라 전체 문장에서 특정 문자를 대치하거나 제거한다.
- 이 과정을 담당하는 기능
- 텍스트가 term으로 분리되기 전 전처리 하는 역할
ES 에는 총 3가지의 캐릭터 필터 존재
- HTML Strip Character Filter
- Mapping Character Filter
- Pattern Replace Character Filter
HTML Strip Character Filter
- HTML 태그를 제거하는 Filter
- <> 로 된 태그를 제거할 뿐 아니라 같은 태그도 함께 제거한다.
Mapping Character Filter
- 지정한 단어를 다른 단어로 치환할 수 있는 Filter
Pattern Replace Character Filter
- 정규식(Regular Expression)을 이용해 좀 더 복잡한 패턴들을 치환
토크나이저
- 문장에 속한 단어들을 term 단위로 하나씩 분리해내는 처리 과정을 담당
- 데이터 색인 과정에서 검색 기능에 가장 큰 영향을 미치는 단계
토크 나이저는 반드시 1개만 적용이 가능하다.
크게 3가지로 나눌 수 있다.
- 단어 지향 토크나이저
- 일반적으로 전체 텍스트를 개별 단어로 토큰화 하는데 사용
- ex) standard, letter, lowercase 등
- 부분 단어 토크나이저
- 부분적인 단어 일치를 위해 텍스트 또는 단어를 작은 조각으로 나눔
- ex) N-Gram, Edge N-Gram 등
- 구조화된 텍스트 토크나이저
- 보통 전체 텍스트보다는 식별자, 이메일 주소, 우편번호 및 경로와 같은 구조화된 텍스트와 함께 사용
- ex) Keyword, Pattern, Simple Pattern 등
단어 지향 토크 나이저
Standard
- 공백으로 term을 구분하면서 “@” 과 같은 일부 특수문자를 제거
- “jumped!”, “jumped.” 의 느낌표, 마침표 처럼 단어 끝에 있는 특수문자는 제거
- “3.5”, “ko.beom_seok” 처럼 중간에 있는 마침표나 밑줄 등은 제거되거나 분리되지 않는다.
Letter
- 알파벳을 제외한 모든 공백, 숫자, 기호들을 기준으로 텀을 분리한다.
- “ko.beom_seok” 같은 단어도 “ko”, “beom”, “seok” 처럼 모두 분리된다.
Whitespace
- 스페이스, 탭 그리고 줄바꿈 같은 공백만을 기준으로 term을 구분한다.
- 특수문자, 마지막의 마침표 등도 사라지지 않고 그대로 남아있다.
Letter는 검색범위가 넓어져 너무 많은 결과가 나올 수 있다.
Whitespace는 특수문자를 거르지 않아 정확하게 검색을 하지 않으면 검색결과가 나오지 않는다.
따라서 보통 standard를 많이 사용한다.
종류 예시 예시 : ko.beom_seok @ jumped! 3.5 yes. Standard ko.beom_seok / jumped / 3.5 / yes Letter ko / beom / seok / jumped/ yes Whitespace ko.beom_seok / @ / jumped! / 3.5 / yes. Letter 토크나이저의 경우 검색 범위가 넓어져서 원하지 않는 결과가 많이 나올 수 있고,
Whitespace 의 경우 특수문자를 거르지 않기 떄문에 정확하게 검색을 하지 않는 이상 검색 결과가 나오지 않을 수도 있다.
보통은 Standard 토크나이저를 많이 사용합니다
부분 단어 토크나이저
Ngram
- 기본적으로 한 글자씩 토큰화
- 다양한 옵션을 조합해서 사용할 수 있다. ⇒ 자동완성 시에 유용
Edge Ngram
- 지정된 문자의 목록 중 하나를 만날 때마다 시작 부분을 고정시켜 단어를 자르는 방식으로 사용
Ngram - 시작하는 문자가 정해져 있지 않다.
Edge Ngram - 시작부분을 고정시킬 수 있다.
구조화된 텍스트 토크나이저
Keyword
- 전체 텍스트를 하나의 토큰으로 만든다.
- 여러 토큰으로 나누지 ❌, 단일 용어와 정확히 동일한 텍스트를 출력
- 토큰 필터와 결합해 출력을 정규화 할 수 있다.
Pattern
- 분리할 패턴을 기호 또는 정규식 형태로 지정할 수 있다.
- 정규식을 사용하여 단어 구분 기호와 일치할 때마다 텍스트를 용어로 분할하거나 일치하는 텍스트를 용어로 캡처
토큰 필터
- 분리된 term 들을 하나씩 가공하는 과정을 담당
- 토크나이저에서 분리된 토큰들을 변형하거나 추가, 삭제 할 때 사용
- 독립적으로 사용할 수 없다. (토크나이저에서 토큰이 분리되어야 사용 가능)
토큰 필터는 0개 부터 여러 개를 적용할 수 있다.
Lowercase
- 거의 모든 텍스트 검색 사례에서 사용되는 토큰 필터
- term들을 모두 소문자로 변경하여 저장하는 역할
Uppercase
- 모든 term들을 대문자로 변경하는 것
Stop Token Filter
- 불용어 (stopword, 검색에서 의미가 없는 조사나 전치사 같이 검색어로 쓰이지 않는 단어)에 해당하는 term을 제거
- 인덱스로 만들고 싶지 않거나 검색되지 않게 하고 싶은 단어를 등록해 불용어 사전을 구축
Synonym Token Filter
- 동의어를 처리할 수 있는 필터
- Ex) “AWS” 검색시 “Amazon” 또는 한글 “아마존”도 같이 검색을 하도록 한다.
동의어를 설정하는 옵션
- synonyms : 직접 동의어 목록을 입력
- synonyms_path : 동의어 사전 파일을 만들어 설정
애널라이저
_analyze API
- Elasticsearch에서는 분석된 문장을 _analyze API를 이용해 확인할 수 있다.
- 어떻게 term으로 분리될지 미리 확인 가능
ex : snowball 애널라이저
- whitespace 토크나이저
- lowercase, stop, snowball 토큰필터 사용
- “jumping” 을 snowball 애널라이저를 거쳐 실제 검색 → jump로 검색한다.
사용자 정의 애널라이저
- 실제로 인덱스에 저장되는 데이터의 처리에 대한 설정은 애널라이즈만 적용할 수 있다.
- 매핑에 아무 설정을 하지 않은 경우 디폴트로 적용되는 애널라이저는 standard 애널라이저 이다.
- 사용자가 만든 인덱스에 애널라이저를 설정하고 싶으면 인덱스를 만들 때 설정해주면 된다.
참고자료
'🔍 elastic search' 카테고리의 다른 글
Elasticsearch + Springboot (0) 2022.09.27 ES - Aggregations (0) 2022.09.22 ES - 데이터 검색 (1) 2022.09.21 ES - 기본 API (0) 2022.09.21 Docker로 ES 설치하기 (1) 2022.09.21