Elasticsearch란?
자바 기반 오픈소스 검색 엔진
Elasticsearch의 데이터 색인
원본 데이터 → 색인 → 인덱스
색인(indexing)
원본 문서를 변환하여 저장하는 과정
인덱스(index, indices)
- 색인 과정을 거친 결과물
- 색인된 데이터가 저장되는 저장소
샤드(shard)
- 인덱스는 샤드(shard)라는 단위로 분리되고 각 노드에 분산되어 저장된다.
- 프라이머리 샤드 & 레플리카 샤드
- 노드에 문제가 발생하여 샤드를 손실하였을 경우 복구를 위하여 프라이머리 샤드와 레플리카 샤드는 서로 다른 노드에 저장된다.
- 프라이머리 샤드가 손실된 경우 레플리카 샤드가 프라이머리 샤드로 승격되고 새로 레플리카 샤드를 만들게 된다.
(참고) 노드
- 마스터 노드
- 인덱스의 메타 데이터, 샤드의 위치와 같은 상태 정보 관리
- SPOF 위험성이 있으므로 백업용 마스터 노드를 준비하여 이를 해결할 수 있다.
- 데이터 노드
Elasticsearch 검색 정확도(relavancy) 평가 방법
- Elasticsearch에서는 BM25라는 알고리즘을 이용하여 정확도를 평가한다.
- BM25 알고리즘에 중요한 요소는 TF, IDF, FL이다.
- TF(Term Frequency)
- document에 검색된 term이 많을 수록 점수가 높아진다.
- IDF(Inverse Document Frequency)
- 검색한 term을 포함하고 있는 document 개수가 많을수록 해당 term에 대한 점수 낮아진다.
- ex) quick이 들어간 문서 3개, dog가 들어간 문서 4개 → quick이 들어간 경우 더 높은 점수를 가지게 된다.
- FL(Field Length)
- document에서 term이 필드 길이가 큰 필드 보다 짧은 필드에 있는 경우 더 높은 점수를 받게된다.
Elasticsearch의 역인덱스(inverted-index)
- 역인덱스 덕분에 빠른 검색 가능하다.
- 역인덱스
* 특정 단어가 출현하는 doc을 저장한 형태
(참고) Elasticsearch의 텍스트 분석
- 애널라이저
- 텍스트 분석을 처리하는 기능을 의미하며 애널라이저는 캐릭터 필터, 토크나이저, 토큰 필터로 이루어져 있다.
- 사용자 정의 애널라이저를 만들 수 있다.
- 캐릭터 필터(character filter)
- 토크나이저(tokenizer)
- 반드시 1개
- document들을 term으로 분리
- 토큰 필터(token filter)
- 0 ~ n개
- 설정된 규칙에 따라 분리된 term들을 처리
- 대문자 변환, 소문자 변환
- 불용어 제거
- 문법상 변형된 단어를 기본 형태로 변환
Elastic Search의 키워드 검색과 RDBMS의 LIKE 검색의 차이
- Elasticsearch의 키워드 검색은 알고리즘을 통해서 가장 유사한 순서대로 결과를 나타낸다.
- RDBMS에서의 LIKE 검색은 와일드카드로 시작하지 않는 경우에만 인덱스를 사용하고 나머지 경우는 전체를 탐색하기 때문에 상대적으로 느리다.