Elastic 가이드 북 요약 및 정리

Jonas Kim·2024년 9월 8일
0

IT Study

목록 보기
1/7
post-thumbnail

김종민님의 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 클러스터 구조
    • 여러 서버에 하나의 클러스터로 실행 가능
    • 각 노드는 두 개의 네트워크 통신 포트 사용
      1. HTTP 포트 (9200-9299): 클라이언트와의 통신용
      2. 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) 프로세스
    1. discovery.seed_hosts 설정에 있는 주소 순서대로 노드 탐색
    2. 노드 존재 시 cluster.name 확인
    3. cluster.name 일치 시 같은 클러스터로 바인딩
    4. 불일치 시 다음 주소 확인
    5. 모든 주소 탐색 후 노드를 찾지 못한 경우 새로운 클러스터 시작
    • 일반적으로 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 - 입력, 조회, 수정, 삭제

  1. 입력 (PUT)
    • 새 문서 생성
    • URL 구조: http://<호스트>:<포트>/<인덱스>/_doc/<문서 id>
    • _create를 사용하여 새 문서 입력만 허용 가능
  2. 조회 (GET)
    • 문서 내용 조회
    • _source 항목에 실제 문서 내용 표시
  3. 삭제 (DELETE)
    • 문서 또는 인덱스 단위 삭제 가능
    • 문서 삭제 시 "result": "deleted" 응답
    • 인덱스 삭제 시 "acknowledged": true 응답
  4. 수정 (POST)
    • _update API 사용
    • 특정 필드만 업데이트 가능
    • 내부적으로는 전체 문서를 다시 입력하는 방식으로 동작

벌크 API - _bulk API

  • 여러 작업을 배치로 실행
  • index, create, update, delete 작업 지원
  • 명령문과 데이터문을 한 줄씩 교대로 입력
  • 대량 데이터 입력 시 필수적으로 사용

검색 API - _search API

  1. URI 검색
    • URL 파라미터로 검색어 전달 (예: ?q=field:value)
    • AND, OR, NOT 연산자 지원 (대문자로 입력)
    • 간단한 검색에 적합
  2. 데이터 본문 검색
    • 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

  1. match_all
    • 조건 없이 모든 도큐먼트 검색
    • 쿼리 미입력 시 기본 적용
  2. match
    • 가장 일반적인 풀 텍스트 검색 쿼리
    • 여러 검색어 입력 시 기본적으로 OR 조건 적용
    • AND 조건으로 변경 가능 (오퍼레이터 옵션 사용)
  3. match_phrase
    • 정확한 구문 검색에 사용
    • 검색어 순서까지 고려
    • slop 옵션으로 단어 사이 간격 조절 가능
  4. 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)가 이 과정을 수행
  • 애널라이저는 다음 구성요소로 이루어짐
    1. 캐릭터 필터 (0-3개): 특정 문자 대체/제거
    2. 토크나이저 (1개): 텍스트를 개별 텀으로 분리
    3. 토큰 필터 (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
  • 기능
    • <> 태그 제거
    • &nbsp; 같은 HTML 엔티티 해석

2. Mapping

  • 지정한 단어를 다른 단어로 치환
  • 특수문자 포함 검색 기능 구현 시 필수
  • 사용 방법:
    1. 매핑 규칙 정의 (예: + => _plus_)
    2. 사용자 정의 캐릭터 필터 생성
    3. 애널라이저에 적용

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 옵션
    • 분석된 형태소의 품사 정보 표시
    • 대부분의 애널라이저나 쿼리에서 사용 가능
  • 주요 특징
    1. 사용자 사전 지원
      • 파일 경로 또는 규칙 배열로 지정 가능
      • 우선순위가 높아 먼저 추출됨
    2. 합성어 처리
      • decompound_mode로 처리 방식 결정
      • 예: "백두산" → "백두" + "산"
    3. 품사 기반 필터링
      • nori_part_of_speech 토큰 필터 사용
      • 특정 품사(예: 조사, 형용사) 제거 가능
    4. 한자 변환
      • nori_readingform 토큰 필터로 한자를 한글로 변환
    5. 상세 분석 정보
      • 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: 누적 합계 계산
profile
Sr. Data Scientist at AWS

0개의 댓글