issues
search
My-Books-projects
/
etc
0
stars
1
forks
source link
Elasticsearch
#229
Open
newjaehun
opened
5 months ago
newjaehun
commented
5 months ago
Elasticsearch vs RDBMS ‘LIKE’
RDMBS
user테이블의 name에 홍길동이 존재할때
인덱스 사용
select * from user where name LIKE ‘홍길동%’ 빠르게 검색 가능
인덱스 사용불가
select * from user where name LIKE ‘%길동%’ 전체 테이블 스캔이 필요→성능저하
Elasticsearch
전문검색엔진. ‘길동’과 같은 복잡한 검색을 효율적으로 할 수 있음
{"match": {"name": "길동"}}로 빠르게 검색 가능
색인전 토큰화를 수행하기 때문에 맞춤형 검색이 가능하다.
RDBMS에서 불가능한 비정형 데이터의 색인과 검색이 가능하다.
형태소 분석을 통해 자연어 처리가 가능하다.
동의어나 유의어를 활용한 검색이 가능하다.
역색인 지원으로 매우 빠른 검색이 가능하다.
단점으로는 인덱싱이 필요하기 때문에 실시간 처리는 불가능하다.
ELK 스택
동작방법
Logstash는 서버 사이드 데이터 처리 파이프라인으로, 다양한 소스에서 동시에 데이터를 수집, 변환, 그리고 Elasticsearch 같은 저장소에 전송합니다. 입력, 필터, 출력 플러그인을 사용하여 데이터를 원하는 형태로 가공할 수 있습니다.
Elasticsearch
:
분산형 검색 및 분석 엔진입니다. JSON 형태의 데이터를 저장하고, 빠르게 검색하고, 복잡한 쿼리를 실행하여 데이터를 분석할 수 있습니다. 또한, 대규모 데이터셋에 대한 실시간 분석과 검색 기능을 제공합니다.
Kibana는 Elasticsearch에 저장된 데이터를 시각화하고 탐색하기 위한 웹 기반 인터페이스입니다. 대시보드를 생성하여 데이터를 시각적으로 분석하고, 실시간으로 데이터를 모니터링할 수 있습니다.
Elasticsearch
설명
인덱스: 데이터의 저장공간, 하나의 인덱스는 하나의 타입만 가진다
7.0버전부터는 기본적으로 1개/1개이다
샤드
색인된 문서는 하나의 인덱스에 담긴다.
인덱스 내부에 색인된 데이터는 물리적인 공간에 여러 개의 파티션으로 나누어 구성되는데, 이 파티션을 샤드라고 부른다.(자동으로 생성된다)
레플리카샤드는 프라이머리샤드에서 CUD작업을 처리하고 데이터가 복제됨, 읽기작업을 분산처리함
문서
엘라스틱서치에서 데이터가 저장되는 최소단위. 기본적으로 JSON 포맷으로 저장됨.
DB에서 테이블의 행이 엘라스틱서치의 문서에 해당한다.
중첨 구조를 지원해 문서 안에 문서 지정 가능
필드
문서를 구성하기 위한 속성
DB 에서의 컬럼과 비교할 수 있으나 컬럼은 정적인 데이터 타입인 데 반해, 필드는 동적인 타입이다.
하나의 필드는 목적에 따라 다수의 데이터 타입을 가질 수 있다.
ex) 영화 정보를 담아둔 문서에 제목 필드가 있다고 가정, 제목 검색시 매칭 검색을 하거나, 초성을 이용한 검색이 모두 지원되도록 제목필드는 2개의 데이터 타입을 가져야한다.
매핑
문서의 필드와 필드 속성을 정의하고 그에 따른 색인 방법을 정의하는 프로세스다.
필드타입
Keyword
별도의 분석기를 거치지 않고 원문 그대로 색인
Text
색인시 지정된 분석기가 칼럼의 데이터를 문자열 데이터로 인식하고 분석한다.
별도 분석기 미설정시 기본으로 Standard Analyzer를 사용한다.
전체 텍스트가 토큰화되어 생성되며 특정 단어를 검색하는 것이 가능해진다.
문서ID를 미지정하면 UUID를 통해 무작위로 생성된다.
엘라스틱서치와 동기화된 DB에 데이터가 변경되었을 경우, 검색엔진은 해당 db와 주기적으로 동기화해야 하기 때문에 변경된 내용을 따라 동기화돼야 한다.
이를 위해 엘라스틱에 색인된 _id값을 1만건 그 이상일 텐데 DB의 PK 같은 식별되는 키값과 매칭된 정보가 별도로 저장해야하는건 불가능하다. 따라서 DB의 고유값과 맞춰주는게 좋다.
검색
HTTP URI 형태의 파라미터를 URI에 추가해 검색하는 방법
RESTful API 방식인 QueryDSL을 사용해 요청 본문(body)에 질의내용 추가해 검색하는 방법
spring data elasticsearch
필터
Html strip char 필터
역색인
설명
일반적인 색인이 문서에서 단어를 찾아 문서 번호를 리스트업하는 방식이라면, 역색인은 그 반대로 각 단어가 어떤 문서에 등장하는지를 기록한다. 검색하고자 하는 단어가 주어졌을 때, 해당 단어를 포함하고 있는 모든 문서를 빠르게 찾아낼 수 있게 해줍니다.
방법
문서를 토큰화하여 개별 단어로 분해합니다.
각 단어에 대해 해당 단어가 등장하는 문서의 ID와 위치를 기록합니다.
이 정보를 바탕으로 단어별로 문서의 리스트를 만들어, 단어를 키(key)로 하고 문서 리스트를 값(value)으로 하는 역색인을 생성합니다.
토크나이저
type: ngram
설정된 min_gram, max_gram 범위에 따라 텍스트를 분리한다.
부분 문자열 검색을 가능하게 하여 검색 유연성이 증가된다.
type: nori_tokenizer
한국어 텍스트를 분석하고, 복합명사를 기본형태와 분해된 형태로 토큰화 한다.
decompound_mode가 mixed로 설정되어, 복합명사는 원형과 분해된 형태 모두 토큰으로 생성
필터
type: nori_part_of_speech
stoptags와 일치하는 토큰을 찾아 제거한다(감탄사, 조사 등. 커스텀 가능)
type: synonym
미리 준비된 파일을 통해 동의어 처리를 수행. 정확성을 높일 수 있다.
Elasticsearch vs RDBMS ‘LIKE’
ELK 스택
Elasticsearch