2019-09-07(토) 폭풍속에서 성대히 치뤄진 "[JavaCafe] 생초보를 위한 엘라스틱서치 가이드" 강의에 대한 메모입니다.
01. 검색엔진과 DB Like 검색의 결과가 다른 이유 [김흥래 자바카페 운영진]
https://www.slideshare.net/heungrae_kim/db-like
DB Like의 한계
다수의 웹 프로그래밍을 기반으로 한 프로젝트를 보면 검색은 필수적이다. 우리가 선택한 보통의 검색방식은 아래 슬라이드와 같은 방식을 선택한다. 가장 먼저 생각나기도 하고 기초적인 검색 쿼리다.
하지만, 검색기반 기술이 발전하면서 우리는 위 슬라이드 기준 category와 같은 코드기반 검색이 아닌 title, content 등의 긴 텍스트 속에서 검색이 이뤄지길 바란다. 여기서 Like 검색의 한계가 보인다.
이용자는 "순정만화"의 키워드로 검색이 이뤄지길 바라지만 실제 데이터는 "순정 만화".
이용자는 "윤상현 메이비"의 키워드로 검색이 이뤄지길 바라지만 실제 데이터는 "윤상현♥메이비".
이용자는 "아버지"의 키워드로 검색이 이뤄지길 바라지만 실제 데이터는 "아빠".
검색어 키워드와 일치하는 것만 검색해오기 때문에 중간에 띄어쓰기가 들어있는 경우, 두 가지 키워드로 검색하고 싶은 경우, 동의어를 함께 검색하고 싶은 경우를 만족시킬 수 없다.
즉 DB Like로는 검색 텍스트와는 다르게 저장된 데이터를 조회할 수 없으며, 1억건 이상의 데이터가 적재되어 있을 경우 속도 혹은 안정성 이슈가 발생할 수 있다.
Full Text?
검색엔진에는 텍스트를 검색하는 엔진, 동영상 검색엔진, 음악 검색엔진 등 다양한 엔진이 있다. 오늘의 관점은 텍스트 검색엔진이고 보통 Full Text Search라고 부른다. Full Text는 이미지, CSS, 글 등의 복합적으로 이뤄진 컨텐츠에서 순수하게 텍스트만 추출한 데이터를 의미한다. 보통 이 과정을 크롤링으로 구현한다. 엘라스틱서치에서의 검색엔진에는 크롤러가 빠져있어 별도로 구축해야한다.
Apache Lucene
Apache Lucene은 대표적인 Full text엔진이며 자바로 만들어진 오픈소스 라이브러리다. 플랫폼이나 프레임워크가 아닌 하나의 머신에서 도는 단순 라이브러리 형태이다. Elastic Search는 이 Apache Lucene를 감싸서 웹통신을 하게하고 여러 장비로 클러스터링한 것이라고 볼 수 있다.
Apache Lucene은 자바로 만들어져 있기 때문에 쉽게 core를 import 하여 쉽게 사용할 수 있다. 또한 Elastic Search를 사용하다가 특정 단어가 검색되지 않는다거나 하는 상황에서 이 Apache Lucene 라이브러리를 이용해 직접 테스트 코드를 작성하여 디버깅이 가능하다는 것도 장점이다.
6.대 버전 이전까지의 Lucene은 Elastic Search와 버전이 달랐지만 오픈소스인 Apache Lucene에 Elastic Search 소속 개발자의 기여도가 높아지면서 6.대 이후로 엘라스틱서치와 버전이 동일해졌다고 한다.
토큰화과정
Lucene의 블랙박스 내 토큰화과정이 있다. 토큰화 과정의 핵심은 분석기다. 토크나이저와 필터가 조합되어 분석기를 구성한다. 풀텍스트 쿼리가 분석기를 거쳐 여러 개의 토큰이 발생하고, 그 토큰에 인덱싱이 이루어진다. 동일한 쿼리를 넣더라도 어떠한 필터를 넣느냐, 빼느냐에 따라 토큰을 조절할 수 있다. 색인된 토큰은 파일형태로 보관된다. 아래 슬라이드의 왼쪽 "bunch of words"가 토큰화 과정을 거처 "bunch"와 "words"라는 토큰으로 저장되는 것을 알 수 있다.
색인과정
색인의 물리적 형태는 파일이다. 해당 단어가 어느 도큐먼트에 포함되어 있는지 저장하는 과정이며, 이는 분석기를 통해 색인을 구현한다. 그러므로 분석기가 중요하다. 분석기에서 동의어 필터를 거치면서 비슷한 단어를 의미하는 토큰을 생성할 수도 있다. 예를 들면 "nice"와 "great"를 비슷한 의미로 보는 동의어 필터를 만드는 것이다.
색인된 토큰은 파일로 저장되는데 그 중 segment 파일 안에 토큰들이 바이너리 형태로 저장된다. 토큰이 늘어날 때마다 segment 파일이 새로 구성되는데, 파일의 수가 너무 많아지면 IO 성능에 영향을 주기 때문에 Apache Lucene은 주기적으로 segment 파일을 자동 merge한다.
검색엔진을 이용할 때 DB Like의 검색결과와 달라지는 이유의 핵심은 "토큰"이지 않을까. 토큰으로 인덱싱한 파일로 저장함으로써 DB의 부하도 줄일 수 있고, 검색의 효능도 크게 상승할 수 있다. 토큰이 어느 도큐먼트의 속해있는지 저장하는 방식을 채택함으로써 DB자체에서 적용하는 인덱스를 줄여 DB용량 확보도 가능할 것이다. 무엇보다 우아하게 구조를 짠다는 점에서 큰 의미라고 생각한다.
'.etc' 카테고리의 다른 글
[생초보를 위한 엘라스틱서치 가이드] 엘라스틱 서치를 위한 키워드들 (0) | 2019.09.12 |
---|---|
[생초보를 위한 엘라스틱서치 가이드] Elasticstack으로 생초보도 할 수 있는 데이터 시각화 (0) | 2019.09.10 |
[생초보를 위한 엘라스틱서치 가이드] 한글 형태소 분석하기 기초 (0) | 2019.09.10 |
CSRF란? (0) | 2019.07.04 |
0. JWT(Json Web Tocken)의 기본 개념 (0) | 2019.07.04 |