1. 용어
RDB와 비교해서 비교하면 더 헷갈리수 있을 것 같아, 순수 엘라스틱서치만 분석해보자
Index : 데이터를 저장하는 논리적인 단위이다. 이안에 실제로 데이터가 저장되는 것은 아니다. 데이터의 유형을 분리해주는 단위라 생각해라.
Field : 데이터의 속성이다. 인덱스는 다양한 field로 구성되어있다.
Document : 실제 데이터의 값. 속성값을 모두 갖고 있을수도 있고, 없을 수도 있다. 비정형 데이터의 특징이다.
Shard : 데이터가 저장되는 물리적인 단위이다. Index는 여러개의 샤드로 나뉜다. 기본은 5개이다. 하나의 인덱스를 생성하면 자동으로 5개의 샤드도 생성된다.
Node : Elasticsearch를 구성하는 하나의 단위 프로세스. 여러 인덱스가 모여 하나의 노드를 구성하고 다른 노드끼리 인덱스(샤드)의 복제가 주로 이루어진다.
Cluster : 가장 큰 집합. 여러 노드가 모여 하나의 클러스터를 구성한다. 동일 클러스터 내에 데이터는 모두 조회가 가능하다.
2. 동작 방식
먼저 비정형 데이터를 저장하기 위해서는 역 인덱스를 사용한다. 역 인덱싱란 하나의 문서를 하나의 텀으로 참조하게끔 인덱스를 설정하는 것을 말한다. 가령 I am a boy라는 문장이 문서1에 있을때 boy라는 단어를 검색했을때 문서1이 나오는 것을 의미한다.
이러한 역 인덱스를 어떻게 하는지 알아보자.
애너라이저 : 역인데싱을 하기 위해 단어를 분류하고 가공하는 분석기이다. 애너라이저는 토큰라이저와 토큰 필터로 구성된다. 토큰라이저는 문장을 토큰으로 나누는 큰 틀을 담당하고 필터는 그 토큰을 가공하는 역할을 한다.
issue : 대부분의 토크나이저는 whitespace, stop-word를 사용해서 단어를 분류한다. 그런데 영어와 다르게 한국어는 조사가 있다.
"나는 소년이다. " 라는 문장을 분류하면 "나는", "소년이다" 이렇게 토큰이 나오지만 보통은 소년이란 키워드로 검색이 이루어지기 때문에 한글에는 기존 영어의 방식으로 처리하기 무리가 있다.
====>>> 은전한닢, Nori 한글 형태소 분석기 (따로 설치는 필요) "tokenizer" : "nori_tokenizer" => "나" "는" "소년" "이다"
가공된 토큰들을 문서의 역 인덱스로 만들어 검색이 가능하게끔 만든다.
이제 인덱싱된 문서를 루씬이 스코어링을 통해 검색결과 노출 순서를 정해준다.