Elasticsearch
Elasticsearch와 RDBMS의 데이터구조 비교
Elasticsearch | RDBMS |
---|---|
인덱스 | 데이터베이스 |
타입 | 테이블 |
도큐먼트 | 로우 |
필드 | 컬럼 |
매핑 | 스키마 |
클러스터
엘라스틱서치의 가장 큰 시스템 단위.
하나의 클러스터는 하나 이상의 노드로 구성.
여러대의 서버가 하나의 클러스터로 구성할 수 있으며, 그 반대도 가능하다.
노드
데이터를 색인하고 검색을 수행하는 단위 프로세스
각 노드는 1개 이상의 데이터 원본과 복사본을 가지고 다른 위치에 나누어 저장한다.
노드가 종료되거나 실행에 실패할 경우 다른 노드로 데이터를 이동한다.
- 마스터노드 : 클러스터 상태 관리
- 데이터노드 : 데이터/입출력, 검색 수행
- 클라이언트 노드 : 색인 및 검색을 위한 명령, 결과 전달
샤드와 복사본(Shard and Replica)
- 샤드는 데이터 검색을 위해 구분되는 최소 단위.
- 색인된 데이터는 여러개의 샤드로 분할되어 저장된다. (분산처리)
- 기본적으로 인덱스당 5개의 샤드와 5개의 레플리카로 분리.
- 샤드와 레플리카를 설정할 때 말고 사용자가 직접 샤드에 접근할 일은 없다.
- 생성된 인덱스의 샤드 설정은 변경 불가능하다.
최초 샤드 (Primary Shard)
- 데이터가 색인되어 저장되는 공간.
- 최초 샤드에 데이터가 색인되면 동일한 수 만큼 레플리카를 생성.
- 최초 샤드가 유실되는 경우 레플리카를 최초 샤드로 승격.
- 최초 샤드와 레플리카는 서로 다른 노드에 저장한다
REST API
- 엘라스틱서치는 기본적으로 REST API으로 데이터를 처리한다.
- REST API를 용하기 위한 주소는 다음과 같다.
- http://host:port/{INDEX}/{TYPE}/{DOCUMENTID}
검색
- 검색 기능은 query 명령어를 이용해 수행한다.
- 타입 및 인덱스의 범위로 질의가 가능하다.
- 여러개의 인덱스를 묶어서 멀티 인덱스의 범위로 질의 또한 가능하다.
- URI를 통한 검색 시
- http://host:port/{INDEX}/{TYPE}/_search?q=
- q 매개변수에 값을 입력한다.
- hit : 검색 결과, took : 실행 소요 시간
- Multi tanancy
- http://host:port/{INDEX1},{INDEX2}/_search?q=
- 여러 인덱스를 동시에 검색한다.
- REQUEST BODY 검색
- JSON을 통해 질의한다.
- QueryDSL 사용
SEARCH TYPE
검색을 수행하는 방법을 지정.
query_then_fetch : 전체 샤드의 검색이 모두 수행된 후 결과 출력. 전체 취합된 결과를 size 매개변수에서 지정한 수만큼 출력.
query_and_fetch : 샤드별로 검색되는대로 결과 출력. size * 샤드의 갯수만큼 출력.
dfs_query_then_fetch : 검색방식은 query_then_fetch와 같으나 정확한 스코어링을 위해 검색어들을 사전 처리.
dfs_query_and_fetch : 검색방식은 query_and_fetch와 같으나 정확한 스코어링을 위해 검색어들을 사전 처리한다.
count : 검색된 도큐먼트를 배제하고 전체 hits수만 출력.
scan : 검색 결과를 바로 보여주지 않고 저장했다가 _scroll_ id를 사용해 나중에 결과 출력
쿼리와 필터
Elasticsearch의 검색 방법은 크게 쿼리와 필터로 나뉜다.
쿼리와 필터는 모두 QueryDSL로 작성한다.
쿼리(Query) | 필터(Filter) | |
---|---|---|
검색 대상(일반적) | Full Text(전문 검색) | Bianry(Y/N) |
점수 계산 | O | X |
캐싱 | X | O |
응답속도(상대적) | 느림 | 빠름 |
형태소 분석 과정
- 대문자는 모두 소문자로 변환한다.
- 중복된는 단어는 제거한다.
- 분석 과정을 거치고 거장도니 토큰을 term이라고 한다.
Query
term 쿼리
- term 옵션을 사용.
- 질의문이 저장된 term과 정확히 일치하는 내용을 찾는다.
{
"query" : {
"term" : {
"message" : "취소"
}
}
}
|
terms 쿼리
- terms 옵션으로 2개 이상의 텀을 같이 검색한다.
- terms 쿼리의 값은 항상 배열 형식으로 입력한다.
- minimum_shuld_match 옵션으로 최소 일치 수도 지정 가능하다.
{
"query" : {
"terms" : {
"message" : ["인증", "취소"],
"minimum_shuld_match" : 2
}
}
}
|
match 쿼리, mutlti match 쿼리
- match 옵션을 사용한다.
- 질의문 또한 형태소 분석을 거친 뒤 사용한다.
- multi_match옵션을 사용하면 여러 필드에서 검색 가능하다.
- analyzer 옵션으로 원하는 형태소 분석 적용을 가능하다.
- 한글은 엘라스틱서치에서 기본 지원하지 않아 은전한닢(http://eunjeon.blogspot.kr)이라는 커스텀 형태소 분석기를 이용한다.
{
"query" : {
"match" : {
"message" : {
"query" : "인증을 취소합니다."
}
}
}
} |
bool 쿼리
내부의 질의로 다른 질의를 포함시켜 사용한다.
쿼리를 조건문인 bool 조합으로 적용하여 최종 검색 결과를 나타낸다
- must : AND 조건
- must_not : NOT 조건
- shuld : 해당할 필요는 없으니 해당 될 경우 더 높은 점수를 가진다.
fuzzy 쿼리
- 편집거리 알고리즘(르벤슈타인 알고리즘)을 기반으로 유사 단어 검색 지원.
- 숫자, 날짜 형식을 대상으로 범위 검색으로 응용 가능.
Filter
스코어를 계산하지 않아 쿼리에 비해 월등히 빠름.
결과가 메모리에 캐싱됨(_cache 옵션으로 캐싱 여부 설정 가능)
은전한닢 (한글 형태소 분석기)
엘라스틱서치 점수 측정 방법
- Term frequency: 문서(필드) 안에 term이 자주 출현할수록 고득점
- Inverse document frequency: 색인된 모든 문서(필드)에 term이 적게 존재할수록 고득점
- Length norm: 문서(필드)가 짧을수록 고득점
https://www.slideshare.net/seunghyuneom/elastic-search-52724188