Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Elasticsearch #229

Open
newjaehun opened this issue Apr 8, 2024 · 0 comments
Open

Elasticsearch #229

newjaehun opened this issue Apr 8, 2024 · 0 comments
Assignees
Labels
technical 기술 문서 작성

Comments

@newjaehun
Copy link

newjaehun commented Apr 8, 2024

Elasticsearch vs RDBMS ‘LIKE’

  • RDMBS
    • user테이블의 name에 홍길동이 존재할때
      • 인덱스 사용
        • select * from user where name LIKE ‘홍길동%’ 빠르게 검색 가능
      • 인덱스 사용불가
        • select * from user where name LIKE ‘%길동%’ 전체 테이블 스캔이 필요→성능저하
  • Elasticsearch
    • 전문검색엔진. ‘길동’과 같은 복잡한 검색을 효율적으로 할 수 있음
      • {"match": {"name": "길동"}}로 빠르게 검색 가능
    • 색인전 토큰화를 수행하기 때문에 맞춤형 검색이 가능하다.
    • RDBMS에서 불가능한 비정형 데이터의 색인과 검색이 가능하다.
    • 형태소 분석을 통해 자연어 처리가 가능하다.
    • 동의어나 유의어를 활용한 검색이 가능하다.
    • 역색인 지원으로 매우 빠른 검색이 가능하다.
    • 단점으로는 인덱싱이 필요하기 때문에 실시간 처리는 불가능하다.

ELK 스택

  • 동작방법
    1. Logstash는 서버 사이드 데이터 처리 파이프라인으로, 다양한 소스에서 동시에 데이터를 수집, 변환, 그리고 Elasticsearch 같은 저장소에 전송합니다. 입력, 필터, 출력 플러그인을 사용하여 데이터를 원하는 형태로 가공할 수 있습니다.
    2. Elasticsearch**:** 분산형 검색 및 분석 엔진입니다. JSON 형태의 데이터를 저장하고, 빠르게 검색하고, 복잡한 쿼리를 실행하여 데이터를 분석할 수 있습니다. 또한, 대규모 데이터셋에 대한 실시간 분석과 검색 기능을 제공합니다.
    3. Kibana는 Elasticsearch에 저장된 데이터를 시각화하고 탐색하기 위한 웹 기반 인터페이스입니다. 대시보드를 생성하여 데이터를 시각적으로 분석하고, 실시간으로 데이터를 모니터링할 수 있습니다.

Elasticsearch

  • 설명
    • 인덱스: 데이터의 저장공간, 하나의 인덱스는 하나의 타입만 가진다
      • 7.0버전부터는 기본적으로 1개/1개이다
    • 샤드
      • 색인된 문서는 하나의 인덱스에 담긴다.
      • 인덱스 내부에 색인된 데이터는 물리적인 공간에 여러 개의 파티션으로 나누어 구성되는데, 이 파티션을 샤드라고 부른다.(자동으로 생성된다)
      • 레플리카샤드는 프라이머리샤드에서 CUD작업을 처리하고 데이터가 복제됨, 읽기작업을 분산처리함
    • 문서
      • 엘라스틱서치에서 데이터가 저장되는 최소단위. 기본적으로 JSON 포맷으로 저장됨.
      • DB에서 테이블의 행이 엘라스틱서치의 문서에 해당한다.
      • 중첨 구조를 지원해 문서 안에 문서 지정 가능
    • 필드
      • 문서를 구성하기 위한 속성
      • DB 에서의 컬럼과 비교할 수 있으나 컬럼은 정적인 데이터 타입인 데 반해, 필드는 동적인 타입이다.
      • 하나의 필드는 목적에 따라 다수의 데이터 타입을 가질 수 있다.
        • ex) 영화 정보를 담아둔 문서에 제목 필드가 있다고 가정, 제목 검색시 매칭 검색을 하거나, 초성을 이용한 검색이 모두 지원되도록 제목필드는 2개의 데이터 타입을 가져야한다.
    • 매핑
      • 문서의 필드와 필드 속성을 정의하고 그에 따른 색인 방법을 정의하는 프로세스다.
      • 필드타입
        1. Keyword
          1. 별도의 분석기를 거치지 않고 원문 그대로 색인
        2. Text
          1. 색인시 지정된 분석기가 칼럼의 데이터를 문자열 데이터로 인식하고 분석한다.
          2. 별도 분석기 미설정시 기본으로 Standard Analyzer를 사용한다.
            1. 전체 텍스트가 토큰화되어 생성되며 특정 단어를 검색하는 것이 가능해진다.
    • 문서ID를 미지정하면 UUID를 통해 무작위로 생성된다.
      • 엘라스틱서치와 동기화된 DB에 데이터가 변경되었을 경우, 검색엔진은 해당 db와 주기적으로 동기화해야 하기 때문에 변경된 내용을 따라 동기화돼야 한다.
      • 이를 위해 엘라스틱에 색인된 _id값을 1만건 그 이상일 텐데 DB의 PK 같은 식별되는 키값과 매칭된 정보가 별도로 저장해야하는건 불가능하다. 따라서 DB의 고유값과 맞춰주는게 좋다.
    • 검색
      • HTTP URI 형태의 파라미터를 URI에 추가해 검색하는 방법
      • RESTful API 방식인 QueryDSL을 사용해 요청 본문(body)에 질의내용 추가해 검색하는 방법
        • spring data elasticsearch
    • 필터
      • Html strip char 필터
    • 역색인
      • 설명
        • 일반적인 색인이 문서에서 단어를 찾아 문서 번호를 리스트업하는 방식이라면, 역색인은 그 반대로 각 단어가 어떤 문서에 등장하는지를 기록한다. 검색하고자 하는 단어가 주어졌을 때, 해당 단어를 포함하고 있는 모든 문서를 빠르게 찾아낼 수 있게 해줍니다.
      • 방법
        1. 문서를 토큰화하여 개별 단어로 분해합니다.
        2. 각 단어에 대해 해당 단어가 등장하는 문서의 ID와 위치를 기록합니다.
        3. 이 정보를 바탕으로 단어별로 문서의 리스트를 만들어, 단어를 키(key)로 하고 문서 리스트를 값(value)으로 하는 역색인을 생성합니다.
  • 토크나이저
    • type: ngram
      • 설정된 min_gram, max_gram 범위에 따라 텍스트를 분리한다.
      • 부분 문자열 검색을 가능하게 하여 검색 유연성이 증가된다.
    • type: nori_tokenizer
      • 한국어 텍스트를 분석하고, 복합명사를 기본형태와 분해된 형태로 토큰화 한다.
      • decompound_mode가 mixed로 설정되어, 복합명사는 원형과 분해된 형태 모두 토큰으로 생성
  • 필터
    • type: nori_part_of_speech
      • stoptags와 일치하는 토큰을 찾아 제거한다(감탄사, 조사 등. 커스텀 가능)
    • type: synonym
      • 미리 준비된 파일을 통해 동의어 처리를 수행. 정확성을 높일 수 있다.
@newjaehun newjaehun self-assigned this Apr 8, 2024
@newjaehun newjaehun converted this from a draft issue Apr 8, 2024
@newjaehun newjaehun moved this to Done in My-Books-project Apr 8, 2024
@newjaehun newjaehun added the technical 기술 문서 작성 label Apr 8, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
technical 기술 문서 작성
Projects
Status: Done
Development

No branches or pull requests

1 participant