본문 바로가기

Backend Study/ELK Stack

02. 엘라스틱서치 살펴보기

#실행
elasticsearch

#설정파일
sudo find / -name elasticsearch.yml

#위치
/opt/homebrew/etc/elasticsearch/elasticsearch.yml

 

2.1.1 기본 용어

인덱스

데이터 저장 공간이다. 하나의 인덱스는 하나의 타입만 가지며 하나의 물리적인 노드에 여러 개의 논리적인 인덱스를 생성할 수 있다.

분산 환경으로 구성하면 하나의 인덱스가 여러 노드에 분산 저장되어 관리된다. 엘라스틱 서치는 기본적으로 5개의 프라이머리 샤드와 1개의 샤드 세트를 생성한다. 인덱스 이름은 모두 소문자여야한다.

샤드

색인된 문서는 하나의 인덱스, 인덱스 내부에 색인된 데이터는 물리적인 공간에 여러 개의 파티션으로 나누어 구성되는데 이 파티션이 샤드이다.

문서

데이터가 저장되는 최소 단위. 기본적으로 JSON 포맷으로 데이터가 저장된다. 데이터베이스와 비교하면 테이블의 행이 엘라스틱서치의 문서에 해당한다. 하나의 문서는 다수의 필드로 구성되어 있는데, 각 필드는 형태에 따라 용도에 맞는 데이터 타입을 정의해야한다.

필드

문서를 구성하기 위한 속성이다. 칼럼과 비교할 수 있다. 목적에 따라 다수의 데이터 타입을 가질 수 있다.

매핑

문서의 필드와 필드의 속성을 정의하고 그에 따른 색인 방법을 정의하는 프로세스.

 

2.1.2 노드의 종류

클러스터는 물리적인 노드 인스턴스들의 모임이다. 분산 처리를 위해서는 다양한 형태의 노드들을 조합해서 클러스터를 구성해야한다.

기본적으로 마스터노드가 전체적인 클러스터를 관리하고, 데이터 노드가 실제 데이터를 관리한다.

 

마스터 노드: 

- 클러스터를 관리한다.

- 노드 추가와 제거 같은 클러스터의 전반적인 관리를 담당한다.

(노드를 마스터 노드 전용으로 설정하고자 한다면 엘라스틱 서치 서버의 conf 폴더 안의 elasiticsearch.yml 파일 수정 )

데이터 노드:

- 실질적인 데이터를 저장한다. 샤드가 배치되는 노드이다.

- 검색과 통계같은 데이터 관련 작업을 수행한다.

코디네이팅 노드

- 사용자의 요청만 받아서 처리한다.

- 클러스터 관련 요청은 마스터 노드에 전달하고 데이터 관련 요청은 데이터 노드에 전달한다.

인제스트 노드

- 문서의 전처리 작업을 담당한다.

인덱스 생성 전 문서의 형식을 다양하게 변경할 수 있다.

 

2.1.3 클러스터, 노드, 샤드

엘라스틱서치 클러스터는 인덱스의 문서를 조회할 때 마스터 노드를 통해 2개의 노드를 모두 조회해서 각 데이터를 취합한 후 결과를 하나로 합쳐서 제공한다.  여러개의 클러스터를 연결해서 구성할수도 있으먀, 이때는 클러스터의 이름으로 각각을 구분한다.

 

elasticsearch에서 다양한 형태의 데이터 타입

keyword: 단순한 문자열 저장
text: 형태소 분석 가능

+숫자, 날짜 타입 있음. 

 

 

kibana를 통하여 문서 생성하기

PUT movie_kibana_execute/_doc/1
{
  "message":"helloworld"
}

생성된 문서 검색하기

GET movie_kibana_execute/_search
{
  "query":{
    "match_all": {}
  }
}

 

2.2.2 문서관리 API

single-document API

Index API: 한 건의 문서를 색인한다.

Get API: 한 건의 문서를 조회한다.

Delete API: 한 건의 문서를 삭제한다.

Update API: 한 건의 문서를 업데이트한다.

 

Multi-document API

Multi Get API: 다수의 문서를 조회한다.

Bulk API: 대량의 문서를 색인한다.

Delete By Query API: 다수의 문서를 삭제한다.

Update By Query API: 다수의 문서를 업데이트한다.

Reindex API: 인덱스의 문서를 다시 색인한다.

 

문서 생성 (POST 메소드 사용)

ex.

POST /movie/_doc/1 
{
    "movieCd":"1",
    "movieNm":"살아남은 아이",
    "movieNmEn":"Last Child",
    "prdtYear":"2017",
    "openDt":"2019-10-20",
    "typeNm":"장편",
    "prdtStatNm":"기타",
    "nationAlt":"한국",
    "genreAlt":"드라마, 가족",
    "repNationNm":"한국",
    "repGenreNm":"드라마"
    
  
}

* ID를 지정하지 않으면 UUID를 통해서 무작위로 생성된다. (되도록이면 지정해주기)

정상적으로 데이터가  삽입 된 모습

조회 

GET /movie/_doc/1

 

DELETE /movie/_doc/1

 

2.2.2 검색 API

엘라스틱서치 검색 API의 사용 방식은 두가지이다.

1. HTTP URI 형태의 파라미터를 URI에 추가해 검색하는 방법

2. RESTful API 방식인 QueryDSL을 사용해 요청 본문 (Request Body)에 질의 내용을 추가해 검색하는 방법

(2번 방식이 선호됨.)

 

1. URI 방식 

문서 ID인 _id 값을 사용해 문서를 조회 -> URL에 파라미터를 붙여 조회하는 방법이다. 

(primary key로 조회한다고 생각하면 됨)

GET /movie/_doc/(id값 넣기)?pretty=true

[특정 문서 검색하기]

q 파라미터를 사용해 해당 용어와 일치하는 문서만 조회하기

- 별도의 필드명을 지정하지 않으면 존재하는 모든 필드를 대상으로 검색을 수행한다.

POST /movie/_search?q=typeNm:장편

 

URI 질의 검색은 여러 필드를 각기 다른 검색어로 질의하는 것이 어렵다. 쿼리의 조건이 복잡하고 길어지기 때문이다.

이럴때는 JSON 방식으로 질의하자. 

 

2. Request Body 방식

POST movie/_search
{
  "query":{
    "term":{"typeNm":"장편"}
  }
}

 

'Backend Study > ELK Stack' 카테고리의 다른 글

엘라스틱서치 키바나로 스냅샷 생성하기  (0) 2023.01.24
4. 데이터 검색  (0) 2023.01.24
3.4 엘라스틱서치 분석기  (0) 2023.01.22
3. 데이터 모델링  (0) 2023.01.22
검색 시스템 이해하기  (0) 2023.01.08