엘라스틱서치 실무 가이드 1
🙊

엘라스틱서치 실무 가이드 1

Created
May 16, 2024 08:14 AM
Last edited time
Last updated May 20, 2024
Tags
ElasticSearch
Language
URL

Intro::

엘라스틱서치 실무 가이드 1-3 장 정리본입니다.
 

설치 및 환경 세팅

 
services: es01: image: docker.elastic.co/elasticsearch/elasticsearch:7.17.21 container_name: es01 environment: - cluster.name=javacafe-cluster - node.name=javacafe-node1 - network.host=0.0.0.0 - http.port=9200 - transport.tcp.port=9300 - cluster.initial_master_nodes=javacafe-node1 - path.repo=/es/book_backup/search_example,/es/book_backup/agg_example # - discovery.seed_hosts=es02, es03 - bootstrap.memory_lock=true - "ES_JAVA_OPTS=-Xms512m -Xmx512m" ulimits: memlock: soft: -1 hard: -1 volumes: - data01:/usr/share/elasticsearch/data - ./search_example:/es/book_backup/search_example - ./agg_example:/es/book_backup/agg_example ports: - 9200:9200 - 9300:9300 networks: - elastic kibana: image: docker.elastic.co/kibana/kibana:7.17.21 container_name: kibana restart: always environment: ELASTICSEARCH_HOSTS: http://es01:9200 ports: - 5601:5601 depends_on: - es01 networks: - elastic volumes: data01: driver: local networks: elastic: driver: bridge

  • agg_example, search_example 경로를 알맞게 docker-compose.yml 에 작성
    • docker-compose.yml와 같은 레벨에 해당 폴더들을 위치하였습니다.
  • 책에 따라 논리적인 스냅샷을 등록 후 확인해봅시다.
    • 추후 스냅샷을 사용해 인덱스를 복구해 사용하면 됩니다.

기본 개념

  • 엘라스틱서치의 데이터는 인덱스, 타입, 문서, 필드 구조로 구성되어집니다.
  • 인덱스
    • 여러 도큐먼트로 구성된 데이터 저장 공간.
  • 타입
    • 인덱스의 논리적 구조를 의미
    • 장르별로 별도의 인덱스를 각각 생성해서 사용해야 한다고 합니다.
  • 문서(Document)
    • 데이터가 저장되는 최소 단위입니다.
    • 기본적으로 JSON 형태의 데이터로 저장됩니다.
  • 필드
    • 문서를 구성하기 위한 속성이라고 합니다.
    • 일반적인 데이터베이스의 칼럼과 비교할 수 있으나 칼럽이 정적인 데이터인 데 반해 필드는 좀 더 동적입니다.
    • 하나의 필드는 목정에 따라 다수의 데이터 타입을 가질 수 있습니다.
  • 매핑
    • 문서의 필드와 속성을 정의하고 그에 따른 색인 방법을 정의하는 프로세스 입니다.

노드의 종류

  1. 마스터 노드
    1. 클러스터의 전반적인 관리를 담당하는 노드입니다.
  1. 데이터 노드
    1. 실질적인 데이터를 저장하고 검색, 통계 같은 데이터 관련 작업을 수행합니다.
  1. 코디네이팅 노드
    1. 사용자의 요청만 받아서 처리합니다.
  1. 인제스트 노드
    1. 문서의 전처리 작업을 담당합니다.
    2. 인덱스 생성 전 문서의 형식을 다양하게 변경할 수 있습니다.

주요 API

  1. 인덱스 관리 API (indices API)
  1. 문서 관리 API (Document API)
  1. 검색 API (Search API)
  1. 집계 API (Aggregation API)
  • 스키마리스 기능은 가급적이면 사용하지 말자!
    • 데이터 공간이 낭비될 가능성이 존재하고, 원하는 동작을 하지 않게 될 수 있다.

필드 데이터 타입

Keyword

말 그대로 키워드 형태로 사용할 데이터에 적합한 데이터 타입입니다. Keyword타입을 사용할 경우 별도의 분석기를 거치지 않고 원문 그대로 색인하기 때문에
특정 코드나 키워드 등 정형화된 콘텐츠에 주로 사용합니다.
Keyword 데이터 타입은 다음과 같은 항목에서 많이 사용됩니다.
  • 검색 시 필터링되는 항목
  • 정렬이 필요한 항목
  • 집계해야 하는 항목

Text

Text 데이터 타입을 이용하면 색인 시 지정된 분석기가 칼럼의 데이터를 문자열 데이터로 인식하고 이를 분석합니다. 별도의 분석기를 정의하지 않았다면 Standard Analyzer를 사용합니다.
Text 데이터 타입은 전문 검색이 가능하다는 점이 가장 큰 특징입니다. 색인을 통해 전체 텍스트가 토큰화되어 생성되며 특정 단어를 검색하는 것이 가능해집니다.

Array

데이터가 2차원으로 존재해야하는 경우 사용하는 데이터 타입입니다. 엘라스틱서치에서는 매핑 설정 시 Array 타입을 명시적으로 정의하지 않습니다. 모든 필드가 기본적으로 다수의 값을 가질 수 있기 때문입니다.
Array 데이터 타입 예시
PUT movie_search_datatype/_doc/1 { "title": "해리포터와 마법사의 돌", "subtitleLang": ["ko", "en"] }

Numeric

  • long
  • integer
  • short
  • byte
  • double
  • float
  • half_float

Date

별도의 형식을 지정하지 않는다면 "yyyy-MM-ddTHH:mm:ssZ"로 지정된다.
Date데이터 타입 예시
PUT movie_text/_mapping/_doc { "properties": { "date": { "type": "date", "format": "yyyy-MM-dd HH:mm:ss" } } }

Range

범위가 있는 데이터를 저장할 때 사용하는 데이터 타입입니다.

Boolean

참과 거짓이라는 두 논리값을 가지는 데이터 타입입니다.

Geo-Point

위치, 경도 등 위치 정보를 담은 데이터를 저장할때 사용하는 데이터 타입입니다. 위치 기반 쿼리를 이용해 반경 내 쿼리, 위치 기반 집계, 위치별 절렬 등을 사용할 수 있기 때문에 위치 기반 데이터를 색인하고 검색하는 데 매우 유용합니다.

IP

IP주소와 같은 데이터를 저장하는 데 사용합니다.

Oject

JSON 포맷의 문서는 내부 객체를 계층적으로 포함할 수 있습니다. 필드가 단순한 값을 가지고 있을 수 있지만, 또 다른 문서를 포함하는 것도 가능합니다.

Nested

Object 객체 배열을 독립적으로 색인하고 질의하는 형태의 데이터 타입입니다. 특정 필드 내에 Object 형식으로 JSON 포맷을 표현할 수 있습니다. 데이터가 배열 형태로 저장되면 한 필드 내의 검색은 기본적으로 OR 조건으로 검색됩니다. 이러한 특성 탓에 저장되는 데이터의 구조가 조금만 복잡해지면 모호한 상황이 일어날 수 있습니다.
Nested데이터 타입 예시
PUT movie_search_datatype/_doc/7 { "title": "해리포터와 마법사의 돌", "companies": [ { "companyCd": "1", "companyName": "위너브라더스" }, { "companyCd": "2", "companyName": "Heyday Films" } ] }

위의 예제와 같은 경우 companyCd "1" 인 조건과 "2"인 조건 둘다 검색이 된다(companies의 데이터 타입이 Array로 OR 연산이 이루어지기 때문). 이를 해결하기 위해 Nested 데이터 타입을 정의한 후 데이터를 집어넣어준다.
Nested데이터 타입 예시
PUT movie_search_datatype/_mapping/_doc { "properties": { "companies_nested": { "type": "nested" } } } PUT movie_search_datatype/_doc/7 { "title": "해리포터와 마법사의 돌", "companies": [ { "companyCd": "1", "companyName": "위너브라더스" }, { "companyCd": "2", "companyName": "Heyday Films" } ] }

분석기의 구조

CHARACTER FILTER

문장을 분석하기 전에 입력 텍스트에 대해 특정한 단어를 변경하거나 HTML과 같은 태그를 제거하는 역할을 하는 필터이다. 해당 내용은 텍스트를 개별 토큰화하기 전의 전처리 과정이며, ReplaceALL() 함수처럼 패턴으로 텍스트를 변경하거나 사용자가 정의한 필터를 적용할 수 있다.

TOKENIZER FILTER

Tokenizer Filter는 분석기를 구성할 때 하나만 사용할 수 있으며 텍스트를 어떻게 나눌 것인지를 정의한다. 상황에 맞게 적절한 Tokenizer를 사용하면 된다.

TOKEN FILTER

토큰화된 단어를 하나씩 필터링해서 사용자가 원하는 토큰으로 변환한다. 불필요한 단어를 제거하거나 동의어 사전을 만들어 단어를 추가하거나 영문 단어를 소문자로 변환하는 등의 작업을 수행할 수 있다. Token Filter는 여러 단계가 순차적으로 이루어 지며, 순서를 어떻게 지정하느냐에 따라 검색의 질이 달라질 수 있다.

동의어 사전

<엘라스틱서치 설치 디렉토리>/config/analysis/synonym.txt

동의어 추가

동의어를 추가할 때 단어를 쉼표로 분리해 등록하는 방법이다.
Elasticsearch, 엘라스틱 서치

동의어 치환하기

동의어 치환은 동의어 추가와 구분하기 위해 화살표로 표시한다.
Harry => 해리
 
 

References::

Loading Comments...