Elasticsearch 인덱스 데이터의 CRUD 작업

문서 생성

데이터를 Elasticsearch에 저장할 때는 문서 단위로 인덱싱하며, 이 과정에서 ID를 명시적으로 지정하거나 자동 생성할 수 있다.

1. ID를 직접 지정하여 문서 생성

기존 시스템에서 데이터를 마이그레이션할 경우, 기존 고유 키를 그대로 사용해 문서 ID로 설정하는 것이 유리하다. 이 방식은 데이터의 일관성과 추적성을 유지하는 데 효과적이다.

PUT /users/customer/1001
{
  "username": "kimjisub",
  "age": 30,
  "role": "developer"
}

응답 예시:

{
  "_index": "users",
  "_type": "customer",
  "_id": "1001",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  }
}

2. 자동으로 ID 생성

애플리케이션에서 실시간으로 데이터를 생성하고 Elasticsearch에 직접 저장하는 경우, ID를 자동 생성하는 것이 안전하다. 특히 분산 환경에서 동시성 문제를 방지할 수 있다.

POST /users/customer
{
  "username": "leeminho",
  "age": 28,
  "department": "backend"
}

생성된 ID는 Base64로 인코딩된 20자 길이의 문자열이며, URL 안전성과 충돌 방지를 보장한다.

문서 조회

특정 문서를 검색하거나 원하는 필드만 추출하는 등의 조작이 가능하다.

1. ID 기반 문서 검색

GET /users/customer/1001

결과:

{
  "_index": "users",
  "_type": "customer",
  "_id": "1001",
  "_version": 1,
  "found": true,
  "_source": {
    "username": "kimjisub",
    "age": 30,
    "role": "developer"
  }
}

2. _source 필드 제어

  • 오직 _source 내용만 가져오기:
    GET /users/customer/1001/_source
  • _source 반환 비활성화:
    GET /users/customer/1001?_source=false
  • 필드 포함/제외 필터링:
    GET /users/customer/1001?_source_includes=username,age&_source_excludes=role
  • 저장된 필드만 선택 (stored_fields):
    GET /users/customer/1001?stored_fields=username,age

문서 수정

Elasticsearch는 내부적으로 불변한 역색인(Lucene)을 사용하므로, 문서 수정은 실제로는 재색인(reindexing)을 의미한다.

1. 전체 교체 방식 (Full Update)

기존 문서를 완전히 새로운 JSON 객체로 대체한다. ID가 존재하면 덮어쓰고, 없으면 새로 생성한다.

PUT /users/customer/1001
{
  "username": "kimjisub_updated",
  "age": 31,
  "role": "senior_developer",
  "skills": ["Java", "Elasticsearch"]
}

수정 후 버전(_version)은 증가하며, 기존 문서는 삭제 플래그(deleted flag)가 설정되고 이후 백그라운드에서 정리된다.

2. 강제 생성 (Create-Only)

문서가 이미 존재할 경우 실패하게 하여, 의도치 않은 덮어쓰기를 방지한다.

PUT /users/customer/1001/_create
{
  "username": "duplicate_attempt"
}

존재하는 ID로 요청 시 다음과 같은 오류 발생:

{
  "error": {
    "type": "version_conflict_engine_exception",
    "reason": "[customer][1001]: version conflict, document already exists"
  },
  "status": 409
}

이 메커니즘은 데이터 무결성을 보장하는 데 유용하다.

문서 삭제

특정 문서를 논리적으로 삭제할 수 있다.

DELETE /users/customer/1001

응답 예시:

{
  "_index": "users",
  "_type": "customer",
  "_id": "1001",
  "_version": 2,
  "result": "deleted",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  }
}

Elasticsearch는 즉시 물리적 삭제를 수행하지 않고, 삭제 대상 문서에 '삭제됨' 마크를 붙인다. 이후 세그먼트 병합(segment merge) 과정에서 실제로 제거된다. 이를 게으른 삭제(lazy deletion)라고 한다.

태그: elasticsearch CRUD Document Management indexing REST API

6월 18일 17:28에 게시됨