Elasticsearch


Elasticsearch와 RDBMS의 데이터구조 비교

ElasticsearchRDBMS
인덱스데이터베이스
타입테이블
도큐먼트로우
필드컬럼
매핑스키마


클러스터

엘라스틱서치의 가장 큰 시스템 단위.

하나의 클러스터는 하나 이상의 노드로 구성.

여러대의 서버가 하나의 클러스터로 구성할 수 있으며, 그 반대도 가능하다.


노드

데이터를 색인하고 검색을 수행하는 단위 프로세스

각 노드는 1개 이상의 데이터 원본과 복사본을 가지고 다른 위치에 나누어 저장한다.

노드가 종료되거나 실행에 실패할 경우 다른 노드로 데이터를 이동한다.

  • 마스터노드 : 클러스터 상태 관리
  • 데이터노드 : 데이터/입출력, 검색 수행
  • 클라이언트 노드 : 색인 및 검색을 위한 명령, 결과 전달


샤드와 복사본(Shard and Replica)

  • 샤드는 데이터 검색을 위해 구분되는 최소 단위.
  • 색인된 데이터는 여러개의 샤드로 분할되어 저장된다. (분산처리)
  • 기본적으로 인덱스당 5개의 샤드와 5개의 레플리카로 분리.
  • 샤드와 레플리카를 설정할 때 말고 사용자가 직접 샤드에 접근할 일은 없다.
  • 생성된 인덱스의 샤드 설정은 변경 불가능하다.

최초 샤드 (Primary Shard)

  • 데이터가 색인되어 저장되는 공간.
  • 최초 샤드에 데이터가 색인되면 동일한 수 만큼 레플리카를 생성.
  • 최초 샤드가 유실되는 경우 레플리카를 최초 샤드로 승격.
  • 최초 샤드와 레플리카는 서로 다른 노드에 저장한다


REST API

  • 엘라스틱서치는 기본적으로 REST API으로 데이터를 처리한다.
  • REST API를 용하기 위한 주소는 다음과 같다.
    • http://host:port/{INDEX}/{TYPE}/{DOCUMENTID}

검색

  • 검색 기능은 query 명령어를 이용해 수행한다.
  • 타입 및 인덱스의 범위로 질의가 가능하다.
  • 여러개의 인덱스를 묶어서 멀티 인덱스의 범위로 질의 또한 가능하다.
  • URI를 통한 검색 시 
  • 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)
점수 계산OX
캐싱XO
응답속도(상대적)느림빠름



형태소 분석 과정


  • 대문자는 모두 소문자로 변환한다.
  • 중복된는 단어는 제거한다.
  • 분석 과정을 거치고 거장도니 토큰을 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 옵션으로 캐싱 여부 설정 가능)


은전한닢 (한글 형태소 분석기)

http://eunjeon.blogspot.kr/

품사태그표 : https://docs.google.com/spreadsheets/d/1-9blXKjtjeKZqsf4NzHeYJCrr49-nXeRF6D80udfcwY/edit#gid=589544265


엘라스틱서치 점수 측정 방법

  • Term frequency: 문서(필드) 안에 term이 자주 출현할수록 고득점
  • Inverse document frequency: 색인된 모든 문서(필드)에 term이 적게 존재할수록 고득점
  • Length norm: 문서(필드)가 짧을수록 고득점

http://www.popit.kr/bm25-elasticsearch-5-0%EC%97%90%EC%84%9C-%EA%B2%80%EC%83%89%ED%95%98%EB%8A%94-%EC%83%88%EB%A1%9C%EC%9A%B4-%EB%B0%A9%EB%B2%95/




https://www.slideshare.net/seunghyuneom/elastic-search-52724188

+ Recent posts