김종민님의 Elastic 가이드 북을 기반으로 개인적으로 학습한 내용을 요약 및 정리한 글입니다.
2. Elasticsearch 시작하기
설치 및 실행
- Elasticsearch 실행 요구사항
- Java 1.8 이상 설치 필요
- JAVA_HOME 환경변수 설정 필요
- Elasticsearch 7.0부터는 OpenJDK가 포함되어 별도 Java 설치 불필요
- 설치 및 실행 방법
- ZIP/TAR 압축 해제 후 bin/elasticsearch 실행 (Windows는 bin\elasticsearch.bat)
- 백그라운드 실행 옵션
- -d: 데몬으로 백그라운드 실행
- -p <파일명>: 프로세스 ID를 지정 파일에 저장
- 로그 확인
- 기본 경로: logs/elasticsearch.log
- 프로세스 관리
- ps 명령어로 실행 중인 프로세스 확인 가능
- kill 명령어로 프로세스 종료 가능
- 배포판 종류
- 기본 배포판: Apache 2.0 + Elastic 라이센스 혼합
- OSS 배포판: Apache 2.0 라이센스만 포함
elasticsearch 환경 설정
- Elasticsearch 설정 파일
- jvm.options: Java 힙 메모리 및 환경변수 설정
- elasticsearch.yml: Elasticsearch 주요 옵션 설정
- log4j2.properties: 로그 관련 옵션 설정
- elasticsearch.yml 주요 설정
- cluster.name: 클러스터 이름 지정
- node.name: 노드 이름 지정
- node.attr: 노드 속성 지정
- path.data: 데이터 저장 경로
- path.logs: 로그 저장 경로
- network.host: 노드 IP 주소 설정
- http.port: HTTP 통신 포트 (기본 9200)
- transport.port: 노드 간 통신 포트 (기본 9300)
- discovery.seed_hosts: 클러스터 구성을 위한 원격 노드 주소
- cluster.initial_master_nodes: 초기 마스터 노드 지정
- 노드 역할 설정
- node.master: 마스터 노드 역할
- node.data: 데이터 저장 역할
- node.ingest: 데이터 전처리 역할
- node.ml: 머신러닝 작업 수행 역할
- 설정 적용 방법
- elasticsearch.yml 파일 수정
- 실행 시 커맨드 라인 옵션 (-E) 사용
- 설정 우선순위
- 커맨드 라인 옵션 > elasticsearch.yml 파일
3. Elasticsearch 시스템 구조
클러스터 구성
- Elasticsearch 클러스터 구조
- 여러 서버에 하나의 클러스터로 실행 가능
- 각 노드는 두 개의 네트워크 통신 포트 사용
- HTTP 포트 (9200-9299): 클라이언트와의 통신용
- TCP 포트 (9300-9399): 노드 간 데이터 교환용
- 일반적으로 물리 서버당 하나의 노드 실행 권장
- 노드 구성 옵션
- 여러 물리 서버에 각각 노드 실행 가능
- 하나의 물리 서버에 여러 노드 실행 가능:
- 포트 할당: 9200, 9201, ... (HTTP), 9300, 9301, ... (TCP)
- 클러스터 구성을 위한 핵심 설정: cluster.name
- 동일한 cluster.name을 가진 노드들이 하나의 클러스터로 묶임
- 클러스터 구성 방법
- config/elasticsearch.yml 파일에서 설정
- 실행 커맨드를 통한 설정 가능 (예: bin/elasticsearch -Ecluster.name=es-cluster-1 -Enode.name=node-1)
- 마스터 노드
- 각 클러스터에 반드시 하나의 마스터 노드 존재
- 마스터 노드 선출 과정이 로그에 기록됨
- 디스커버리 (Discovery) 프로세스
- discovery.seed_hosts 설정에 있는 주소 순서대로 노드 탐색
- 노드 존재 시 cluster.name 확인
- cluster.name 일치 시 같은 클러스터로 바인딩
- 불일치 시 다음 주소 확인
- 모든 주소 탐색 후 노드를 찾지 못한 경우 새로운 클러스터 시작
- 일반적으로 3-5개의 마스터 후보 노드만 discovery.seed_hosts에 설정
- 포트 할당 메커니즘
- 같은 서버에서 여러 노드 실행 시 자동으로 다음 포트 할당
- 예: 첫 번째 노드 (9200, 9300), 두 번째 노드 (9201, 9301)
- 다중 클러스터 운영
- 동일 서버에서 서로 다른 cluster.name으로 여러 클러스터 실행 가능
- 클러스터 간 데이터 교환 불가능
- 노드 추가 시 동작
- 새 노드는 기존 마스터 노드를 찾아 클러스터에 조인
- 마스터 노드는 새 노드 추가 정보를 로그에 기록
- 설정 주의사항
- 프로덕션 환경에서는 discovery.seed_hosts, discovery.seed_providers, 또는 cluster.initial_master_nodes 중 하나 이상 설정 필요
인덱스와 샤드
- 인덱스와 샤드 구조
- 도큐먼트(document): Elasticsearch의 단일 데이터 단위
- 인덱스(Index): 도큐먼트의 집합
- 샤드(shard): 인덱스가 분리되는 기본 단위, Lucene의 단일 검색 인스턴스
- 샤드 타입
- 프라이머리 샤드(Primary Shard): 원본 데이터를 저장
- 리플리카(Replica): 프라이머리 샤드의 복제본
- 샤드 설정
- Elasticsearch 7.0+: 기본 1개 샤드
- Elasticsearch 6.x 이하: 기본 5개 샤드
- 복제본: 기본 1개 생성
- 샤드 분산 및 복제
- 샤드들은 클러스터의 노드들에 분산 저장
- 프라이머리 샤드와 리플리카는 반드시 서로 다른 노드에 저장
- 데이터 가용성 및 무결성
- 노드 유실 시 남은 복제본으로 데이터 유지
- 복제본 유실 시 새로운 복제본 생성
- 프라이머리 샤드 유실 시 복제본이 프라이머리로 승격
- 샤드 개수 설정
- 프라이머리 샤드 수: 인덱스 생성 시 지정, 변경 불가
- 복제본 수: 생성 후 변경 가능
마스터 노드와 데이터 노드
- 마스터 노드(Master Node)
- 클러스터 상태 정보 관리
- 기본적으로 모든 노드가 마스터 후보 노드
- 설정: node.master: true/false
- 데이터 노드(Data Node)
- 실제 색인된 데이터 저장
- 설정: node.data: true/false
- 노드 역할 분리
- 마스터 전용 노드: 클러스터 관리만 담당
- 데이터 전용 노드: 데이터 처리에 집중
- Split Brain 문제
- 네트워크 분리로 인한 클러스터 분할 시 발생
- 데이터 정합성 및 무결성 위협
- Split Brain 방지
- 마스터 후보 노드를 3개 이상의 홀수로 설정
- minimum_master_nodes 설정 (6.x 이전)
- cluster.initial_master_nodes 설정 (7.0+)
- 운영 권장사항
- 최소 3개 노드로 클러스터 구성
- 마스터 후보 노드는 3개 이상의 홀수로 설정
- 필요시 마스터 노드와 데이터 노드 역할 분리
4. Elasticsearch 데이터 처리
- Elasticsearch 데이터 저장 형식
- JSON 문서 사용
- 쿼리, 클러스터 설정 등 모든 정보를 JSON 형태로 주고받음
REST API
- HTTP 프로토콜 사용
- 자원별로 고유 URL 접근
- HTTP 메서드: PUT, POST, GET, DELETE 사용
- RESTful 시스템의 특성을 가짐
CRUD - 입력, 조회, 수정, 삭제
- 입력 (PUT)
- 새 문서 생성
- URL 구조: http://<호스트>:<포트>/<인덱스>/_doc/<문서 id>
- _create를 사용하여 새 문서 입력만 허용 가능
- 조회 (GET)
- 문서 내용 조회
- _source 항목에 실제 문서 내용 표시
- 삭제 (DELETE)
- 문서 또는 인덱스 단위 삭제 가능
- 문서 삭제 시 "result": "deleted" 응답
- 인덱스 삭제 시 "acknowledged": true 응답
- 수정 (POST)
- _update API 사용
- 특정 필드만 업데이트 가능
- 내부적으로는 전체 문서를 다시 입력하는 방식으로 동작
벌크 API - _bulk API
- 여러 작업을 배치로 실행
- index, create, update, delete 작업 지원
- 명령문과 데이터문을 한 줄씩 교대로 입력
- 대량 데이터 입력 시 필수적으로 사용
검색 API - _search API
- URI 검색
- URL 파라미터로 검색어 전달 (예: ?q=field:value)
- AND, OR, NOT 연산자 지원 (대문자로 입력)
- 간단한 검색에 적합
- 데이터 본문 검색
- JSON 형식의 쿼리 사용 (QueryDSL)
- 복잡한 검색에 적합
- 예: match 쿼리 사용
- 멀티테넌시 (Multitenancy)
- 여러 인덱스를 동시에 검색 가능
- 쉼표(,)로 나열하거나 와일드카드(*) 사용
- 예: logs-2018-*/_search
- 기타 특징
- 트랜잭션 개념 없음 (커밋, 롤백 불가)
- _all 지정자로 모든 인덱스 검색 가능 (권장되지 않음)
- Kibana Dev Tools: REST API를 쉽게 사용할 수 있는 도구 제공
5. 검색과 쿼리 - Query DSL
- Query DSL (Domain Specific Language)
- Elasticsearch의 검색 쿼리 기능
- JSON 형식으로 입력해야 함
- Elasticsearch SQL도 있지만 모든 기능을 활용하기 위해 Query DSL 숙지 권장
풀 텍스트 쿼리 - Full Text Query
- match_all
- 조건 없이 모든 도큐먼트 검색
- 쿼리 미입력 시 기본 적용
- match
- 가장 일반적인 풀 텍스트 검색 쿼리
- 여러 검색어 입력 시 기본적으로 OR 조건 적용
- AND 조건으로 변경 가능 (오퍼레이터 옵션 사용)
- match_phrase
- 정확한 구문 검색에 사용
- 검색어 순서까지 고려
- slop 옵션으로 단어 사이 간격 조절 가능
- query_string
- Lucene의 검색 문법을 본문 검색에 활용
- 복잡한 조건 조합 가능
Bool 복합 쿼리 - Bool Query
- 여러 쿼리를 조합하여 사용
- 주요 인자
- must: 참인 도큐먼트 검색
- must_not: 거짓인 도큐먼트 검색
- should: 해당 쿼리에 맞는 도큐먼트 점수 상승
- filter: 참인 도큐먼트 검색 (스코어 계산 X, 캐싱 가능)
정확도 - Relevancy
- 검색 결과가 검색 조건과 얼마나 정확히 일치하는지 계산
- 스코어(score) 점수로 표현
- BM25 알고리즘 사용 (TF, IDF, 필드 길이 고려)
정확값 쿼리 - Exact Value Query
- 참/거짓 여부만 판별
- term, range 등의 쿼리가 해당
- 주로 bool 쿼리의 filter 내부에서 사용
범위 쿼리 - Range Query
- 숫자나 날짜 형식 검색에 사용
- 주요 파라미터: gte, gt, lte, lt
- 날짜 검색 시 다양한 포맷과 예약어(now) 사용 가능
- 기타
- function_score 쿼리: 범위 쿼리에 기준점 설정 가능
- geo_point, nested 등 특수 데이터 검색 쿼리 존재
6. 데이터 색인과 텍스트 분석
역 인덱스 - Inverted Index
- Elasticsearch가 사용하는 핵심 데이터 구조
- 각 고유 텀(term)에 대해 해당 텀을 포함하는 문서 ID 목록을 저장
- 빠른 풀 텍스트 검색을 가능하게 함
- RDBMS의 like 검색보다 훨씬 효율적
텍스트 분석 - Text Analysis
- 원본 텍스트를 검색 가능한 텀으로 변환하는 과정
- 애널라이저(Analyzer)가 이 과정을 수행
- 애널라이저는 다음 구성요소로 이루어짐
- 캐릭터 필터 (0-3개): 특정 문자 대체/제거
- 토크나이저 (1개): 텍스트를 개별 텀으로 분리
- 토큰 필터 (0-n개): 생성된 텀을 변형/삭제/추가
- 주요 토큰 필터 기능
- lowercase: 모든 문자를 소문자로 변환
- stop: 불용어(stopwords) 제거
- snowball: 형태소 분석을 통한 어간 추출
- synonym: 동의어 추가
애널라이저 - Analyzer
- _analyze API
- 텍스트 분석 과정을 테스트하고 결과를 확인하는 API
- 토크나이저와 토큰 필터를 지정하여 사용 가능
- 사용자 정의 애널라이저 (Custom Analyzer)
- 인덱스 settings의 analysis 절에 정의
- 토크나이저와 토큰 필터를 조합하여 생성
- 인덱스의 특정 필드에 적용 가능
- 쿼리 타입에 따른 분석 과정
- match 쿼리: 검색어도 애널라이저를 거침
- term 쿼리: 검색어를 그대로 사용 (애널라이저 미적용)
- _termvectors API
- 색인된 문서의 역 인덱스 내용을 확인하는 API
- 특정 문서 ID와 필드에 대한 텀 정보 제공
캐릭터 필터 - Character Filter
- 텍스트 분석 중 가장 먼저 처리되는 과정
- 토크나이저에 의한 텀 분리 전에 전체 문장에 대해 적용되는 전처리 도구
- Elasticsearch 7.0 기준 3가지 캐릭터 필터 존재
- HTML Strip
- Mapping
- Pattern Replace
char_filter
항목에 배열로 입력
- 하나만 적용하거나 여러 개를 순차적으로 적용 가능
1. HTML Strip
- HTML 태그 제거 및 HTML 엔티티 디코딩
- 입력 값:
html_strip
- 기능
<>
태그 제거
같은 HTML 엔티티 해석
2. Mapping
- 지정한 단어를 다른 단어로 치환
- 특수문자 포함 검색 기능 구현 시 필수
- 사용 방법:
- 매핑 규칙 정의 (예:
+ => _plus_
)
- 사용자 정의 캐릭터 필터 생성
- 애널라이저에 적용
3. Pattern Replace
- 정규식(Regular Expression)을 이용한 복잡한 패턴 치환
- 설정 항목
pattern
: 변경할 패턴 (정규식)
replacement
: 대체할 문자열
토크나이저 - Tokenizer
- 데이터 색인 과정에서 검색 기능에 가장 큰 영향
- 반드시 한 개만 사용 가능
tokenizer
항목에 단일값으로 설정
1. Standard, Letter, Whitespace 토크나이저
- Standard
- 공백으로 텀 구분
- 일부 특수문자 제거
- 단어 중간의 마침표나 밑줄은 유지
- Letter
- 알파벳을 제외한 모든 문자를 기준으로 텀 분리
- Whitespace
- 스페이스, 탭, 줄바꿈 같은 공백만을 기준으로 텀 분리
- 특수문자 유지
2. UAX URL Email 토크나이저
- 이메일 주소와 웹 URL을 하나의 텀으로 처리
- 설정:
"tokenizer": "uax_url_email"
3. Pattern 토크나이저
- 특정 패턴을 기준으로 텀 분리
- 설정 항목
pattern
: 분리할 패턴 (기호 또는 Java 정규식)
4. Path Hierarchy 토크나이저
- 경로 데이터를 계층별로 저장
- 설정 항목
delimiter
: 경로 구분자 (기본값: /
)
replacement
: 구분자 대체 문자
토큰 필터 - Token Filter
- 토크나이저로 분리된 각 텀을 지정된 규칙에 따라 처리
filter
항목에 배열로 지정 (주의: token_filter
가 아님)
- 순서가 중요하므로 적용 순서를 고려해야 함
1. Lowercase, Uppercase
- Lowercase
- 모든 텀을 소문자로 변경
- 대부분의 텍스트 검색에서 사용됨
- Uppercase
- 모든 텀을 대문자로 변경
- Lowercase와 동일한 방식으로 설정
2. Stop
- 불용어(stopword) 제거
- 설정 옵션
stopwords
: 불용어 목록 (배열 또는 언어팩)
stopwords_path
: 불용어 목록 파일 경로
- 주의사항
- lowercase 필터를 먼저 적용해야 함
- 사전 파일 변경 시 인덱스 새로고침 필요 (
_close
후 _open
)
- 기존 도큐먼트에는 적용되지 않음 (재색인 필요)
3. Synonym
- 동의어 처리를 위한 토큰 필터
- 설정 방법
synonyms
항목에 직접 입력
synonyms_path
로 사전 파일 지정
- 동의어 규칙
- "A, B => C": A, B를 C로 대체
- "A, B": A와 B를 서로의 동의어로 처리
- 추가 옵션
expand
: 동의어 확장 여부 (기본값: true)
lenient
: 오류 무시 여부 (기본값: false)
4. NGram, Edge NGram, Shingle
- NGram
- 단어의 일부를 나누어 저장
- 옵션
min_gram
: 최소 문자 수
max_gram
: 최대 문자 수
- Edge NGram
- 단어 앞쪽의 NGram만 저장
- 자동완성 기능 구현에 유용
- Shingle
- 단어 단위로 구성된 묶음 생성
- 옵션
min_shingle_size
, max_shingle_size
: 최소/최대 단어 개수
output_unigrams
: 개별 토큰 저장 여부
token_separator
: 토큰 구분자
filler_token
: 대체 텍스트
5. Unique
- 중복되는 텀을 하나만 저장
- TF(Term Frequency) 값에 영향을 줄 수 있으므로 정확도 기반 검색에는 주의 필요
형태소 분석 - Stemming
- 단어의 기본 형태(어간) 추출
- Elasticsearch에서 다양한 형태소 분석기 지원
1. Snowball
- 마틴 포터 박사가 개발한 형태소 분석 알고리즘
- Elasticsearch에서 애널라이저, 토크나이저, 토큰 필터로 모두 제공
2. 노리(nori) 한글 형태소 분석기
- 한글 특성
- 복잡한 형태 변형
- 복합어, 합성어가 많아 여러 어간으로 분리 필요
- 형태소 사전 필요
- 커뮤니티 한글 형태소 분석기
- 아리랑(arirang)
- 은전한닢(seunjeon)
- Open Korean Text
- Nori 개요
- Elasticsearch 6.6 버전부터 공식 지원
- 개발자: Jim Ferenczi (프랑스 엔지니어, Apache Lucene 커미터)
- 은전한닢의 mecab-ko-dic 사전 재가공 사용
- Lucene 기반으로 개발
- Nori 설치
elasticsearch-plugin install analysis-nori
명령으로 설치
elasticsearch-plugin remove analysis-nori
명령으로 제거
- Elastic Cloud: Customize Deployment 메뉴에서 선택
- nori_tokenizer
- 옵션
user_dictionary
: 사용자 사전 파일 경로
user_dictionary_rules
: 사용자 정의 사전 배열
decompound_mode
: 합성어 처리 방식
- none: 완성된 합성어만 저장
- discard (기본값): 어근만 저장
- mixed: 어근과 합성어 모두 저장
- nori_part_of_speech
- 품사(POS) 정보 지정 가능
stoptags
옵션으로 제외할 품사 코드 지정
- 기본 stoptags 값 제공
- nori_readingform
- 한자를 한글로 변환하여 저장
- 별도 옵션 없이 토큰 필터로 지정하여 사용
- explain: true 옵션
- 분석된 형태소의 품사 정보 표시
- 대부분의 애널라이저나 쿼리에서 사용 가능
- 주요 특징
- 사용자 사전 지원
- 파일 경로 또는 규칙 배열로 지정 가능
- 우선순위가 높아 먼저 추출됨
- 합성어 처리
- decompound_mode로 처리 방식 결정
- 예: "백두산" → "백두" + "산"
- 품사 기반 필터링
- nori_part_of_speech 토큰 필터 사용
- 특정 품사(예: 조사, 형용사) 제거 가능
- 한자 변환
- nori_readingform 토큰 필터로 한자를 한글로 변환
- 상세 분석 정보
- explain: true 옵션으로 품사 정보 확인 가능
7. 인덱스 설정과 매핑 - Settings & Mappings
설정 - Settings
- 모든 인덱스는 settings와 mappings 두 가지 정보 단위를 가짐
- 주요 settings 옵션
- number_of_shards: 프라이머리 샤드 수 지정 (기본값 1, 변경 불가)
- number_of_replicas: 리플리카 수 지정 (동적 변경 가능)
- refresh_interval: 세그먼트 생성 주기 설정 (기본값 1초, 동적 변경 가능)
- analyzer, tokenizer, filter: 분석기, 토크나이저, 토큰 필터 정의
매핑 - Mappings
- 필드의 데이터 타입과 특성을 정의
- 동적 매핑: 도큐먼트 추가 시 자동으로 매핑 생성
- 명시적 매핑: 사전에 필드 타입과 옵션 정의 가능
- 기존 매핑 변경 불가 (새 필드 추가만 가능)
- 매핑 생성 시 주의사항
- 숫자 필드의 동적 생성은 위험 (정밀도 손실 가능성)
- 날짜 필드는 가능한 명시적으로 포맷 지정
- 집계나 정렬이 필요한 text 필드는 다중 필드로 keyword 추가 고려
1. 문자열 - text, keyword
- text: 풀 텍스트 검색용, 애널라이저 적용
- 주요 옵션: analyzer, search_analyzer, index, boost, fielddata
- keyword: 정확값 매칭, 집계, 정렬용
- 주요 옵션: index, doc_values, ignore_above, normalizer
2. 숫자 - long, double
- long, integer, short, byte, double, float, half_float, scaled_float
- 주요 옵션
- coerce: 자동 형변환 (기본값 true)
- null_value: null 시 기본값 지정
- ignore_malformed: 잘못된 데이터 무시 (기본값 false)
3. 날짜 - date
- ISO8601 형식 기본 지원
- format 옵션으로 커스텀 날짜 형식 지정 가능
- 내부적으로 long 타입의 epoch_millis로 저장
4. 불리언 - boolean
- true/false 값 저장
- null_value 옵션으로 null 시 기본값 지정 가능
5. Object와 Nested
- Object
- JSON에서 하위 필드를 포함하는 객체 타입 값을 사용 가능
- 매핑에서 properties 아래에 하위 필드 이름과 타입을 지정
- 배열 타입 필드를 별도로 선언하지 않음 - 값만 일치하면 배열로 입력 가능
- 실제 역 색인에서는 object 필드의 하위 필드들이 모두 상위 필드 이름과 함께 펼쳐져서 저장됨
- Nested
- object 타입 필드의 하위 object 값들을 서로 다른 역 색인 구조로 저장하기 위해 사용
- 매핑에서 "type": "nested"로 선언
- nested 쿼리를 사용해야 정확한 검색 가능
- nested 필드 내부 값들을 별개의 도큐먼트로 취급
6. 위치 정보 - Geo
- Geo Point
- 위도와 경도 두 실수 값으로 지도상의 한 점 표현
- 다양한 입력 방식 지원 (object, text, geohash, 배열)
- 매핑에서 "type": "geo_point"로 선언
- geo_bounding_box, geo_distance 등의 쿼리로 검색
- Geo Shape
- 점, 선, 면 등 2차원 위치 정보 저장 및 쿼리
- 매핑에서 "type": "geo_shape"로 선언
- point, multipoint, linestring, multilinestring, polygon, multipolygon, envelope 등의 타입 지원
- geo_shape 쿼리 사용, relation 옵션으로 intersects, disjoint, within 관계 지정
- 주요 특징
- 위치 기반 서비스에 활용 가능한 데이터 타입 제공
- 다양한 형태의 공간 데이터 저장 및 검색 지원
- 복잡한 공간 관계 쿼리 가능
- 효율적인 위치 기반 데이터 처리를 위한 최적화된 구조
7. 기타 필드 타입 - IP, Range, Binary
- IP 필드 타입
- "type": "ip"로 매핑에서 선언
- IPv4 및 IPv6 형식 모두 지원
- 문자열 형태로 IP 주소 입력 가능
- Range 필드 타입
- 숫자, 날짜, IP 등의 2차원 범위 저장
- 타입 종류: integer_range, float_range, long_range, double_range, date_range, ip_range
- 범위 지정에 gt, gte, lt, lte 사용
- range 쿼리 사용 시 relation 옵션 필수 (within, contains, intersects)
- 여행/출장 정보 등에 유용하게 사용 가능
- Binary 필드 타입
- "type": "binary"로 선언
- 바이너리 데이터(시스템 파일, 이미지 등) 저장 가능
- 기본적으로 색인되지 않아 검색/집계 불가
- _source에만 저장됨
- 대용량 바이너리 데이터는 외부 저장소 사용 권장
멀티 (다중) 필드 - Multi Field
- 하나의 필드 값을 여러 역 색인 및 doc_values로 저장
- 매핑에서 fields 항목 내에 추가 필드 정의
- 주로 text 타입과 keyword 타입 동시 사용에 활용
- 다양한 애널라이저 적용 가능
- 다국어 문서 분석에 유용
- 예: message 필드에 대해 일반, 영어, 한국어 분석 동시 적용
- 주요 특징
- 다양한 데이터 타입 지원으로 유연한 데이터 모델링 가능
- 범위 검색, IP 주소 처리, 바이너리 데이터 저장 등 특수한 요구사항 처리 가능
- 멀티 필드를 통한 다양한 분석 및 검색 최적화 가능
- 지속적인 필드 타입 업데이트로 최신 버전 참고 필요
8. 집계 - Aggregations
- 집계(Aggregations) 개요
- Elasticsearch의 데이터 분석 기능
- 단순 검색을 넘어 다양한 연산 수행 가능
- 'aggregations' 또는 'aggs' 키워드로 사용
- 집계 사용 방법
- _search API에서 query와 같은 레벨에 지정
- 여러 개의 집계를 동시에 수행 가능
- 집계 결과는 query 결과의 영향을 받음
- 기술적 고려사항
- 집계 사용 시 "size": 0 설정으로 불필요한 hits 결과 제외 가능
- 깊은 수준의 하위 버킷은 성능에 영향을 줄 수 있음
- 7.2 버전부터 date_histogram의 interval 옵션이 fixed_interval과 calendar_interval로 분리
메트릭 - Metrics Aggregations
- 숫자나 날짜 필드에 대한 계산 수행
- 주요 메트릭 집계 종류
- min, max, sum, avg: 최소, 최대, 합계, 평균 계산
- stats: 위 4가지 값과 count를 한 번에 계산
- cardinality: 필드의 유니크한 값 개수 계산
- percentiles, percentile_ranks: 백분위수 계산
버킷 - Bucket Aggregations
- 문서를 그룹화하여 버킷 생성
- 각 버킷에 대해 doc_count 제공
- 주요 버킷 집계 종류
- range: 숫자 필드에 대해 범위별 버킷 생성
- histogram: 지정된 간격으로 숫자 필드 버킷 생성
- date_range, date_histogram: 날짜 필드에 대한 범위/간격 버킷 생성
- terms: keyword 필드 값별로 버킷 생성
하위 - Sub-Aggregations
- 버킷 내에서 추가 집계 수행 가능
- 메트릭 집계나 다른 버킷 집계를 중첩해서 사용
- 성능 상의 이유로 보통 2레벨 깊이까지만 권장
파이프라인 - Pipeline Aggregations
- 다른 집계의 결과를 입력으로 사용
- buckets_path 옵션으로 입력 버킷 지정
- 주요 파이프라인 집계
- min_bucket, max_bucket, avg_bucket, sum_bucket, stats_bucket
- moving_avg: 이동 평균 계산
- derivative: 미분값 계산
- cumulative_sum: 누적 합계 계산