Elasticsearch 기본개념

WAS·2025년 7월 7일

Elasticsearch

목록 보기
1/4

✅ Elasticsearch

  • RESTful 검색 및 분석 엔진, 데이터 분석에 최적화된 엔진

✅ 용도

  • 주로 Elasticsearch 는 크게 데이터 수집 및 분석, 검색 최적화 이렇게 두가지 용도로 사용한다

데이터 수집 및 분석

  • 대규모 데이터를 수집 및 분석하는데 최적화
  • 주로 데이터 저장(Elasticsearch), 데이터 수집 및 가공(Logstash), 데이터 시각화(Kibana) 를 활용해 데이터 수집 및 분석

검색 최적화

  • 데이터가 많더라도 뛰어난 검색속도를 가지고 있음
  • 오타나 동의어를 고려하여 유연하게 검색할 수 있는 기능을 가지고 있음

✅ Elasticsearch 작동 방식
일반 데이터베이스 (MySQL, ORACLE 등)는 SQL문으로 통신을 해야한다
하지만 Elasticsearch 데이터베이스는 REST API 방식으로 통신을 해야한다 (만든 사람 마음)

EX) 일반 DB에서 데이터 삽입과 조회할 때
INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com');
SELECT * FROM users;

EX) Elasticsearch 에서 데이터 삽입과, 조회할 때

curl -X POST "localhost:9200/users/_doc" -H 'Content-Type: application/json' -d'
{
  "name": "Alice",
  "email": "alice@example.com"
}'

curl -X GET "localhost:9200/users/_search" -H 'Content-Type: application/json' -d'
{
  "query": {
    "match_all": {}
  }
}'

일반 DB에서는 매번 CLI로 SQL문을 입력하기 불편해서 Dbeaver, Sql Developer 와 같은 GUI 툴을 활용한다
Elasticsearch 에서도 매번 API 요청을 보내기 불편하기 때문에 GUI 툴이 존재한다 -> Kibana


도커를 사용하면 Elasticsearch 와 kibana 컨테이너를 각각 띄워서 편하게 사용할 수 있다

Kibana, Elasticsearch 아키텍처 -> kibana를 사용하여 엘라스틱서치를 조작할 수 있음


✅ RDBMS와 Elasticsearch 차이

사진처럼 두개의 차이는 명칭에서 다르다
참고로 RDBMS의 인덱스와 Elasticsearch의 인덱스는 다르다


✅ Elasticsearch 에서 인덱스 생성 = RDBMS에서 테이블 생성

  • 인덱스 생성
    PUT /{인덱스명}
    EX) PUT /users

  • 인덱스 조회
    GET /{인덱스명}
    💡 되도록이면 뒤에 _search 를 붙여서 사용하자 -> GET /{인덱스명}/_search
    EX) GET /users/_search

생성하지 않은 인덱스를 조회하면 index_not_found_exception 발생

  • 인덱스 삭제
    DELETE /{인덱스명}
    EX) DELETE /{users}
    생성하지 않은 인덱스를 삭제하면 index_not_found_exception 발생

✅ Elasticsearch 에서 매핑 을 정의 = RDBMS에서 테이블의 스키마 정의

  • 매핑 정의하기
    💡 매핑을 정의하기 전에 인덱스 를 반드시 생성해야함
    PUT /{인덱스명}/_mappings
// EX
PUT /users/_mappings
{
 "properties": {
 "name": { "type": "keyword" }, // 문자열
 "age": { "type": "integer" }, // 정수형
 "is_active": { "type": "boolean" } // 불린형
 }
}

✅ Elasticsearch 에서 도큐먼트 삽입 = RDBMS에서 테이블에 데이터를 삽입

  • id를 자동으로 생성해서 도큐먼트 삽입하기
    💡 도큐먼트 를 삽입하기전에 반드시 인덱스 생성 은 해야함
    💡 도큐먼트 를 삽입하기전에 매핑 을 하지 않아도 자동으로 타입 추론하여 매핑을 생성함
    -> 의도하지 않은 타입 매핑일 생길 수 있기 때문에 되도록이면 매핑 한 후 도큐먼트를 삽입하자
  • 도큐먼트 삽입방법

아래와 같이 도큐먼트를 삽입하면 랜덤한 ID 값으로 도큐먼트가 삽입됨
POST /{인덱스명}/_doc

// 도큐먼트 저장 (랜덤 id 자동 생성)
 POST /users/_doc
{
 "name": "Alice",
 "age": 28,
 "is_active": true
}

아래와 같이 맨 뒤에 ID 값을 직접 지정해서 도큐먼트 삽입하면
ID 가 없으면 새로 생성, 이미 있으면 전체를 덮어씀
PUT /{인덱스명}/_doc/{id}

// 도큐먼트 저장 및 업데이트
PUT /users/_doc/2
{
 "name": "jason",
 "age": 30,
 "is_active": true
}

_create 를 활용하여 ID를 직접 지정해서 도큐먼트를 삽입하면
해당 ID 값이 없으면 새로 생성 되지만
해당 ID 값이 없으면 (409 ) 에러가 발생
즉 중복생성이 불가능하다
POST /{인덱스명}/_create/{id}

// 도큐먼트 저장 (id 직접 지정)
POST /users/_create/1
{
 "name": "jscode",
 "age": 30,
 "is_active": true
}

💡 즉 _doc 와 _create 의 차이는 중복된 ID 값이 있으면, 덮어쓰거나, 에러가 난다


  • 도큐먼트 조회 방법
    모든 도큐먼트 조회 : GET /{인덱스명}/_search = ex) GET /users/_search
    id로 특정 도큐먼트 조회 : GET /{인덱스명}/_doc/{id} = ex) GET /users/_doc/1

  • 도큐먼트 수정 방법

도큐먼트를 통째로 덮어쒸우기 = PUT /{인덱스명}/_doc/{id} = ex)

PUT /users/_doc/1
{
 "name": "new"
}

특정 도큐먼트만 수정하기 = # POST /{인덱스명}/_update/{id} = ex )

POST /users/_update/2
{
 "doc": {
 "age": 10,
 "is_active": false
 }
}

  • 도큐먼트 삭제 방법
    DELETE /{인덱스명}/_doc/{id}
    ex) DELETE /users/_doc/2
profile
우측 상단 햇님모양 클릭하셔서 무조건 야간모드로 봐주세요!!

0개의 댓글