3분.엘라스틱서치.txt

drakejin·2020년 7월 23일
8

오뚜기 3분

목록 보기
1/1
post-thumbnail

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) 는 김치
    1. tf(Term Frequency): 하나의 문서에서 김치라는 term이 등장한 횟수
    2. idf(Inverse of Document Frequency): log(전체문서수 분의 김치라는 term 포함된 문서 수)
    3. 한 문서에서 김치라는 단어가 등장한 희귀한 키워드일 수록 검색랭킹에서 우의를 점할 수 있다.
    4. 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분 끝

어때여 참 쉽쥬?

profile
그냥 재밌는것만 개발하고 놀고싶어요

1개의 댓글

comment-user-thumbnail
2020년 10월 13일

올려주신 글들이 무척 이해도 잘 가고, 정리가 잘 되어 있어 감사하게 생각하고 싶습니다!!! 개인적으로 '그냥 재밌는것만 개발하고 놀고싶은 돌은자'라는 소개도 너무 마음에 듭니다 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 좋은 글 감사합니다!

답글 달기