Lucene 기반 ElasticSearch에 대해 알아보자
🗝️

Lucene 기반 ElasticSearch에 대해 알아보자

Tags
Elastic Search
Data
Published
June 18, 2024
Author
유레미 EUREMI
ElasticSearch는 루씬 기반의 오픈 소스 검색 엔진입니다. JSON 기반으로 문서를 저장하고 검색할 수 있으며 쿼리를 통해 문서를 검색할 수 있습니다. 이번 포스팅은 ElasticSearch 기초에 대해 설명드리고자 합니다.
 

ElasticSearch의 특징

  • 준 실시간 검색 엔진: 실시간이라고 생각할만큼 색인된 데이터가 매우 빠르게 검색됨. ElasticSearch 클러스터가 실행되고 있는 동안에는 계속해서 데이터가 입력(색인)되고 실시간에 가까운 속도로 색인된 데이터의 검색이 가능하다.
  • 클러스터 구성: 한대 이상의 노드를 클러스터로 구성하여 높은 수준의 안정성을 이루고 부하를 분산할 수 있음
    • 클러스터: 여러대의 컴퓨터 혹은 구성 요소들을 논리적으로 결합하여 전체를 하나의 컴퓨터로 사용할 수 있게 해주는 기술
    • 안정적이며 부하를 분산시킬 수 있다.
  • 스키마리스: 입력될 데이터에 대해 미리 정의하지 않아도 동적으로 스키마를 생성할 수 있음
    • 문서에 어떤 필드를 저장할 것인지 사전에 정의하지 않아도 된다.
  • Rest API: Rest API 기반의 인터페이스를 지원하기 때문에 어떤 언어로도 클라이언트를 만들 수 있다.
    • python으로도 requests를 통해 요청을 보내 원하는 결과를 받을 수 있다.
ElasticSearch 내부적으로는 역파일 색인 구조로 데이터를 저장하고 있으나 데이터를 요청했을 때는 JSON형식으로 전달된다. 여기서 역색인에 대해 설명하자면 일반색인은 문서 ID를 기준으로 해당 문서에 포함된 모든 단어들을 색인하는 방식이라면 반대로 역색인은 단어를 기준으로 해당 단어가 포함된 모든 문서들을 색인하는 방식이다. 아래 내용을 봤을 때 고양이라는 단어를 찾아본다면 1, 3, 6번 문서를 반환하는 것이다.
출처: https://spotintelligence.com/2023/10/30/inverted-indexing/
출처: https://spotintelligence.com/2023/10/30/inverted-indexing/

문서 색인과 조회

ElasticSearch는 JSON 형태의 문서를 저장할 수 있으며, 스키마리스이기 때문에 문서를 색인하기 위해 정형화된 문서의 스키마를 미리 정의할 필요가 없다.(그렇지만 확실히 하기 위해 미리 만들어두는 걸까?)
REST API 메서드
  • PUT: 입력
  • POST: 수정
  • DELETE: 삭제
  • GET: 조회
localhost:9200/user/_doc
데이터 구조 비교
ElasticSearch
RDBMS
Index
Database
Shard
Partition
Type
Table
Document
Row
Field
Column
Mapping
Schema
Query DSL
SQL
REST API와 SQL 비교
ElasticSearch HTTP Method
RDBMS SQL
커멘트
GET
SELECT
PUT
INSERT
POST
UPDATE, SELECT
이 부분이 헷갈렸는데 select의 역할도 한다는 것!
DELETE
DELETE
HEAD (인덱스 정보 확인)

장단점

ES는 NoSQL의 일종으로 분산처리를 통해 실시간성으로 빠른 검색이 가능함. 대량의 비정형 데이터 검색이 가능하다.
장점
  • 오픈소스 검색엔진
  • 전문검색
  • 통계분석 - Kibana를 연결하면 실시간으로 로그를 분석하고 시각화할 수 있다.
  • 스키마리스: 정형화되지 않은 문서도 자동으로 색인하고 검색할 수 있다.
  • RESTful API: HTTP 기반의 RESTful을 활용하고 요청/응답에 JSON을 사용하기 때문에 다양한 언어에서 활용이 가능하다.
  • Multi-tenancy: 서로 상이한 인덱스일지라도 검색할 필드명이 같으면 여러 인덱스를 한번에 조회할 수 있다.
  • Document-Oriented: 여러 계층 구조의 문서로 저장이 가능하며 계층 구조로된 문서도 한번의 쿼리로 쉽게 조회할 수 있다.
  • 역색인
  • 확장성: 분산 환경이 가능하다.
단점
  • 준실시간 → 완전 실시간은 아니다.
  • 트랜잭션, 롤백을 지원하지 않아 입력에 주의할 것!
  • 데이터의 업데이트를 제공하지 않는다.
NoSQL과 차이점은 정보를 있는 그대로만 가져오는 것이 아닌 유의어, 동의어를 검색할 수 있다는 것이다. 유의어를 검색하기 위해선 텍스트 형태의 데이터를 형태소 분할을 한 뒤 문서별로 의미있는 데이터만 추출하여 검색한 것과 가장 가까운 문서를 찾을 수 있다.

참고