ElasticSearch가 데이터를 적재/검색하는 방법
Aug 28, 2019
ElasticSearch 소개자료를 보고 짧게 텍스트로 정리했다.
기존 RDBMS
데이터를 테이블 형식으로 저장한다. 인덱스는 1개 이상의 컬럼으로 설정한다. 데이터 조회 환경(실행계획)에 따라 복수개의 인덱스 중에 어떤 것을 사용할지 결정한다.
id(pk) | title | author | content |
---|---|---|---|
1 | The great Gatsby | F. Fitzgerald | The Great Gatsby is a 1925 novel written by American author … |
2 | 1984 | George Orwell | Nineteen Eighty-Four, often published as 1984, is a dystopian novel by English writer George Orwell published in June 1949 |
ElasticSearch는 Apache Lucene 기반의 검색엔진이다. 엘라스틱서치는 Inverted index를 생성한다.
Inverted index
텍스트를 단어로 분할해서 검색어 사전을 만든다.
Token | id | Token | id |
---|---|---|---|
The | 1 | Great | 1 |
Gatsby | 1 | is | 1 |
Nineteen | 2 | novel | 1, 2 |
written | 1 | by | 1, 2 |
often | 2 | writer | 2 |
author | 1 | Eighty-Four | 2 |
… | … | … | … |
텍스트 처리 과정
- 토큰을 재정렬
- 불용어를 제거: 검색어로 가치가 없는 단어들을 제거한다. a, an, by, the, …
- 형태소 분석: 단어의 수, 상태 등을 표준어로 변경한다. written -> write, writing -> write, books -> book, …
- 동일 토큰을 병합: 위 과정을 거친 토큰을 병합한다.
- 동의어 처리: fast, quick과 같은 동의어의 id를 교차추가한다.
특징 | RDBMS | 검색엔진 |
---|---|---|
저장방식 | 정규화 | 역정규화 |
Text 검색 속도 | 느림 | 빠름 |
의미 검색 | X | O |
Join | O | X |
update | 빠름 | 느림 |
클러스터링
ElasticSearch는 데이터를 샤드 단위로 저장한다. 하나의 인덱스는 여러개의 샤드로 분리해서 복수개의 노드(서버)에 저장된다. 각 샤드는 레플리카(복제본)를 다른 노드에 저장해둔다. 만약 특정 노드가 유실(시스템 다운, 네트워크 단절)되면 유실된 노드에 있던 샤드를 다른 노드에 복제해서 샤드와 레플리카 수를 유지한다. 이를 통해 무결성을 유지할 수 있다.
Tips
- 로그는 날짜별로 저장
- 원본 데이터 유지
- 세그먼트 병합은 사용빈도가 낮은 시간대에