3분시리즈 기본 전제
주로 제 생각과 제 멋대로의 해석을 토대로 작성한 포스트 입니다. elasticsearch에 대한 최소한의 지식만을 원하시는 분들을 위한 3분 시리즈 입니다. 틀린내용과 오해가 충분히 있을 수 있으며, 그에 대한 내용은 댓글로 반박해주시면 열렬히 환영하며 기쁘게 내용을 수정하겠습니다.
Elasticsearch
- elasticsearch는 데이터베이스이다. 그렇지만 데이터베이스는 아니다. 데이터베이스유형으로 굳이 따져 보자면 nosql. 하지만 nosql은 아니다.
왜 이렇게 애매모호하게 말했냐면, elasticsearch의 목적은 저장된 정보를 빠르고 정확하게 찾기 위한 검색엔진이 근본적 목적이기 때문이며, 그를 위해 데이터베이스같은 능력을 갖췄을 뿐이기 때문이다..
- 즉, elasticsearch는 검색엔진이다.
- elasticsearch는 주로 검색서비스 또는 로깅시스템에 사용된다.
- 간단하게는 elasticsearch는 우선 데이터베이스 처럼 데이터를 엘라스틱서치에 넣어두고서 원하는 정보를 빠르고 정확하게 찾게 해주는 검색엔진이다.
검색엔진 원리의 필수 지식 3개 포인트
elasticsearch의 기본 자료구조
Inverted index
- 모든 검색엔진의 기초가 되는 자료구조는 inverted index라는 자료구조에서 시작한다.
- elasitcsearch도 예외는 아니다.
- 위 이미지를 대충 이야기하자면,
best
라는 단어(term)를 포함하는 문서는 2
라는 이야기이다.
search
라는 단어(term) 를 포함하는 문서는 3
- 결론적
best search
라고 검색을하면 [best
, search
]라는 질의어가 만들어지고, 이 값으로 인하여 나와야하는 문서는 [2
, 3
]
- inverted index는 단어(term)을 포함하는 문서(docID)를 쉽게 꺼낼 수 있는 자료구조
TIP:
- term: 검색되어지는 단어. word
- doc: 검색되어지는 수 많은 term들을 포함한 하나의 row
elasticsearch의 랭킹
- 자세한 설명 링크
- 기본 자료구조에서 inverted index에서 데이터를 꺼내는건 알겠는데, 중요한
정확도
는 어떻게 판단하지?
- TF-IDF, BM25 문서 키워드 유사도 알고리즘을 활용한다.
- BM25는 TF-IDF의 단점을 보완한 알고리즘. 수식 베이스는 TF-IDF의 계산식을 활용한 정도 이다.
- 수식 해석 example:
1. w(word) 는 김치
- tf(Term Frequency): 하나의 문서에서
김치
라는 term이 등장한 횟수
- idf(Inverse of Document Frequency): log(전체문서수 분의
김치
라는 term 포함된 문서 수)
- 한 문서에서 김치라는 단어가 등장한 희귀한 키워드일 수록 검색랭킹에서 우의를 점할 수 있다.
- 4번의 꼼수때문에 나온 알고리즘이 BM25.
elasticsearch의 term추출 형태소분석기
- 한글이라는게 과학적인 단어라 과학적으로 분석해야한다. 그래서 한글만 형태소 분석기가 있다. 한글 형태소 분석기로 term을 추출한다.
- 영어는 형태소분석이라 하지 않고 그냥 stemmer, 또는 공백분리로 term을 추출한다.
- 그렇지만 그냥 뭉뚱그려서 형태소분석기라 부르거나 stemmer라 부른다.
- 형태소분석기란 이런 기능을 하는 녀석이다.
- 이렇게 분석했지만, 검색엔진은 품사가 중요하진 않고
[오늘, 은, 날씨, 가 ... 맑, 다]
처럼 한글의 분리가 되게끔 만들어주는게 중요하다. 이 배열의 아이템 하나가 term으로 쓰이게 된다.
삼위일체
형태소 분석기
로 문서에 대한 term을 만들어서 inverted index
라는 데이터 구조를 만듭니다. 그리고 사용자의 검색을 위한 질의어가 들어왔을때에 질의어에 대한 term을 만들어 term들을 가지고 있는 문서를 inverted index
에서 찾아서 TF-IDF
문서 연관도를 계산하여 결과에 대한 소팅을 수행합니다.
인덱스와 샤드
인덱스
- index는 하나의 database table이라 생각해도 좋다. 또는, mongoDB의 collection이라 봐도 좋다.
- index에는 document들이 저장되어있다.
- index도 schema라는게 있다. 그것을 mapping field라 부른다.
- elasticsearch index는 여러개의 shard로 구성되어있으며 하나의 shard는 lucene이기도 하다. 그리고 lucene에는 여러개의 segement(document가 저장된 file)로 이루어져 있다.
샤드
- elasticsearch의 데이터는 primary shard와 replica shard로 두 타입의 샤드로 저장된 데이터를 나눠 저장함.
- primary shard는 shard에 들어있는 documents에 대한 meta정보들이 함께 저장되어있음
- 샤드에는 각각 고유한 번호가 있으며 0번부터 순차적인 정수로 부여받게된다.
- replica shard는 primary shard에 있는 documents들만 저장되어있음.
- replica shard는 primary shard가 유실되었을때 복구하는 용도로도 쓰인다.
- 검색(searching) 할 때에 replica shard가 일한다.
- 색인(indexing) 할 때에 primary shard가 일한다.
- 같은 번호의 replica, primary shard가 cluster에서 유실된다면 클러스터의 상태는 red가 되고, 해당 shard를 이루고있는 index를 삭제하지 않는 이상 복구가 안된다.
- 사실 샤드 하나가 lucene 한개. 이건 직접조사하긔
Tip:
- 색인(indexing): == 저장
- 샤드(shard): 데이터 block
노드와 클러스터
노드
- elasticsearch는 기본적으로 jvm을 이용해서 돌아간다.
- elasticsearch는 java로 작성된 프로세스이다.
- elasticsearch는 master, data, coordinator 그리고 ml 이라는 역할로 노드에 대한 역할이 있다.
클러스터
- elasticsearch는 분산 컴퓨팅 프로세스이다.
- 분산처리를 위해서는 클러스터를 구축해서 사용해야하는데, elasticsearch의 클러스터는 최소 3개의 master node와 2개 이상의 data node, 그리고 1개 이상의 coordinater노드로 구성하는것을 권고하고 있다.
- 그냥 컴퓨터 하나에서 standalone(노드 한대에서 다 해먹기) mode도 있긴 한데, 개발할때에만 쓴다. 서비스에서는 반드시 클러스터구조로 만들어서 내보내는게 암묵적인 룰.
- (사실 모든 정답은 상황에 맞춰서 대응하는게 언제나 정답)
- 하나의 node에는 1개의 index에 대한 primary shard를 1대 씩 두는것이 흔한 패턴
- elasticsearch에는 cluster관리를 위한 다양한 도구들이 있다.
- 클라우드 오케스트레이션, 컨테이너 오케스트레이션 구성자의 입맛에 맞춰 구성할 수 있는 다양한 유틸리티들을 제공하고있다.
⏰ 3분 끝
어때여 참 쉽쥬?
올려주신 글들이 무척 이해도 잘 가고, 정리가 잘 되어 있어 감사하게 생각하고 싶습니다!!! 개인적으로 '그냥 재밌는것만 개발하고 놀고싶은 돌은자'라는 소개도 너무 마음에 듭니다 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 좋은 글 감사합니다!