[Elasticsearch] 용어 정리

서버|2017. 11. 29. 16:47

Elasticsearch는 Lucene 기반의 오픈 소스 검색엔진

실시간 검색, 분석 지원

분산 환경 지원

트랜잭션을 제공하지 않음

업데이트가 빈번하게 발생한다면 다른 NoSQL을 사용

RESTFul 기반 JSON 메시지 사용 (어느 시스템이나 연동하기 쉽게)


Cluster

여러 개의 노드를 하나의 그룹으로 묶어서 서비스


Master node

노드 관리

고사양 컴퓨터 아니어도 된다.


Data node

검색, 색인 처리 (색인은 인덱스를 만드는 과정)

고사양 컴퓨터 권장


Client node

REST 지원

검색에 대한 로드 분산 처리


Shard

인덱스의 조각

데이터 분산


Replica

Shard의 복제본

검색할 때 이용하기도 하며 Replica Shard라고도 불린다.


Index

RDB의 데이타베이스와 유사하다.

 

Type

RDB의 테이블과 유사하다.

 

Document

테이블의 Row와 유사하다.

JSON 문서로 되어 있다. (key, value)

 

Field

엘라스틱 서치의 문서는 JSON이다. JSON의 프로퍼티를 엘라스틱 서치에서는 필드라고 부른다.

RDB 테이블의 컬럼과 유사하다.

 

Mapping

RDB의 스키마와 유사하다.


역색인

역 색인은 엘라스틱서치가 전체 문서를 찾아보지 않고도 하나의 텀(혹은 단어)을 포함하는 문서를 찾도록 해주는 구조다.

"denver" 라는 문자열이 Document 1번과 3번에 존재하고 1번의 Document에는 빈도1, 3번의 Document에는 빈도2 와 같이 기록한다.

출처 : Elasticsearch in Action 도서



analyzer

문장을 분석하는 과정

다음과 같이 input으로 문장이 주어지면 분석 후 index term 을 생성한다.

생성된 index term 을 이용해 역색인이 이뤄지는 구조이다.

출처 : https://www.slideshare.net/omnisis/intro-to-elasticsearch


1
2
3
4
1. Character Filtering이 수행되면 HTML 태그를 제거하고 & 단어를 and로 바꿔주는 작업등을 수행
2. 먼저 각 단어를 분리하는 작업이 수행 (tokenizer)
3. 분리된 단어들을 검색 가능 하도록 가공하는 작업을 수행 (token filter)
tokenizer와 token filter를 합친 것이 analyzer 이다.
cs



full text search

Elasticsearch 는 full text search를 제공한다.

여기서 말하는 full text search는 무엇을 말하는가?

일단 DB의 board 테이블에서 내용을 검색할 때 우리는 다음과 같은 쿼리를 사용한다.

select * from board where content like '%검색내용%'

이와 같은 쿼리는 DB의 index 스캔을 할 수 없다. 결국 board 테이블에 존재하는 모든 row를 다 뒤져야 한다.

성능의 저하가 발행하는 것은 당연지사다.

Elasticsearch는 이 문제를 해결하기 위해 역색인(inverted index)를 활용한다.

즉, "나는 게시판에 글을 작성하고 있습니다. 아하하 검색이 잘 될까요?" 와 같은 게시물을 저장하게 되면 다음과 같이 단어를 마구 쪼개서 인덱싱한다.

눈여겨 볼 것은 콤마(.) 와 물음표(?) 가 제거되었다는 점이다.

이는 analyzer를 통과하면서 각 단어를 분리하고 분리된 단어들을 검색 가능하도록 가공하는 작업을 수행하기 때문이다.

나는

게시판에

글을

작성하고

있습니다

아하하

검색이

될까요

자 여기까지 인덱싱을 마치고 검색을 하게 되면 어떻게 될까?

예를 들어 "게시판에" 라는 검색어로 검색을 하게 되면?

해당 문자는 이미 인덱싱이 되어 있기 때문에 빠르게 결과가 리턴된다.

여기서 궁금한 것이 생긴다. 만약 "게시판" 이라고 검색하고 싶다면?

이런 경우는 한글 형태소 분석기를 설치해서 사용하면 된다.

한글 형태소 분석기로 analyzer하면 "게시판" 과 같은 검색어로도 검색이 가능하게 된다.




댓글()