ElasticSearch ‐ ElasticSearch 기본 개념 - dnwls16071/Backend_Study_TIL GitHub Wiki

📚 ElasticSearch란?

  • ElasticSearch는 오픈 소스 분산, Restful 검색 및 분석 엔진, 확장 가능한 데이터 저장소 및 벡터 데이터베이스를 말한다.
  • 쉽게 말해 ElasticSearch는 검색, 데이터 분석에 최적화된 데이터베이스이다.

참고

📚 ElasticSearch 주요 활용 사례

  • 데이터 수집 및 분석
    • ElasticSearch는 대규모 데이터를 수집 및 분석하는데 최적화되어 있다.
    • 주로 ElasticSearch(데이터 저장), Logstash(데이터 수집 및 가공), Kibana(데이터 시각화)를 같이 활용해 데이터를 수집 및 분석한다,
  • 검색 최적화
    • ElasticSearch는 데이터가 많더라도 뛰어난 검색 속도를 가지고 있고, 오타나 동의어를 고려해서 유연하게 검색할 수 있는 기능을 가지고 있다.

📚 Docker로 ElasticSearch 사용하기

services:
  elastic:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.17.4 # Elastic 8.17.4 버전의 이미지
    ports:
    - 9200:9200
    environment:
    ### 아래 설정은 개발/테스트 환경에서 간단하게 테스트하기 위한 옵션 (운영 환경에서는 설정하면 안 됨)
    - discovery.type=single-node # 단일 노드
    - xpack.security.enabled=false # 보안 설정
    - xpack.security.http.ssl.enabled=false # 보안 설정

📚 ElasticSearch GUI 툴 = Kibana

image

services:
  elastic:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.17.4 # 8.17.4 버전
    ports:
      - 9200:9200 # 9200번 포트에서 Elasticsearch 실행
    environment:
      # 아래 설정은 개발/테스트 환경에서 간단하게 테스트하기 위한 옵션 (운영 환경에서는 설정하면 안 됨)
      - discovery.type=single-node # 단일 노드 (지금은 알 필요 없음)
      - xpack.security.enabled=false # 보안 설정
      - xpack.security.http.ssl.enabled=false # 보안 설정
  kibana:
    image: docker.elastic.co/kibana/kibana:8.17.4 # 8.17.4 버전
    ports:
      - 5601:5601 # 5601번 포트에서 kibana 실행
    environment:
      - ELASTICSEARCH_HOSTS=http://elastic:9200 # kibana가 통신할 Elasticsearch 주소 알려주기

❗MySQL과 통신하려면 SQL을 사용하듯이 ElasticSearch와 통신하려면 REST API를 사용한다.

📚 ElasticSearch의 기본 용어 정리

  • 데이터를 저장하기 위해 인덱스(Index)를 만든다.
  • 인덱스를 만들 때 어떤 유형의 데이터를 넣을지 매핑(Mapping)을 정의한다.
  • 테이블 필드(Field)에 맞게끔 데이터를 저장한다.
MySQL ElasticSearch
테이블(Table) 인덱스(Index)
컬럼(Column) 필드(Field)
레코드(Record), 로우(Row) 도큐먼트(Document)
스키마(Schema) 매핑(Mapping)

📚 인덱스 생성 / 매핑 정의 / 도큐먼트 삽입

[인덱스 생성 및 조회]

# 인덱스 생성
# PUT /{인덱스명}
PUT /users

# 인덱스 생성됐는 지 확인하기
# GET /{인덱스명}
GET /users

# 없는 인덱스를 조회했을 때 응답값 확인하기
GET /abc

[인덱스 삭제]

# 인덱스 생성
PUT /boards

# 인덱스 생성됐는 지 확인하기
GET /boards

# 인덱스 삭제
# DELETE /{인덱스명}
DELETE /boards

# 삭제됐는 지 확인하기
GET /boards

[매핑 정의]

# 매핑 정의하기
# PUT /{인덱스명}/_mappings
PUT /users/_mappings
{
  "properties": {
    "name": { "type": "keyword" },
    "age": { "type": "integer" },
    "is_active": { "type": "boolean" }
  }
}


# 정의한 매핑 확인하기
GET /users

매핑(Mapping)은 MySQL에서 테이블 스키마를 정의하는 것과 같다.

[도큐먼트 삽입 및 조회]

# 도큐먼트 삽입
# POST /{인덱스명}/_doc
POST /users/_doc
{
  "name": "Alice",
  "age": 28,
  "is_active": true
}

POST /users/_doc
{
  "name": "Bob",
  "age": 30,
  "is_active": false
}

# 모든 도큐먼트 조회
# GET /{인덱스명}/_search
GET /users/_search

도큐먼트를 삽입하는 것은 MySQL에서 테이블의 레코드를 삽입하는 것과 같다.

// 도큐먼트 조회 시 응답값
{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 2,
      "relation": "eq"
    },
    "max_score": 1,
    "hits": [
      {
        # _index : 인덱스명
        "_index": "users",
        
        # 데이터를 저장하면서 자동으로 생성된 '랜덤 고유 ID'
        "_id": "0imoJ5YBVwYHNUofQSQc",
        
        "_score": 1,

        # _source : 저장한 데이터가 들어있는 필드
        "_source": {
          "name": "Alice",
          "age": 28,
          "is_active": true
        }
      },
      {
        "_index": "users",
        "_id": "0ymoJ5YBVwYHNUofRSRX",
        "_score": 1,
        "_source": {
          "name": "Bob",
          "age": 30,
          "is_active": false
        }
      }
    ]
  }
}

📚 도큐먼트 CRUD

[도큐먼트 저장]

  • id를 자동으로 생성해서 저장하는 방법
  • id를 직접 지정해서 저장하는 방법
  • id를 직접 지정해서 저장하는 방법(이미 id가 존재한다면 데이터를 덮어 씌움)
# 도큐먼트 저장 (id 자동 생성)
# POST /{인덱스명}/_doc
POST /users/_doc
{
  "name": "Jaeseong",
  "age": 20,
  "is_active": true
}

# 잘 저장됐는 지 확인하기
GET /users/_search 

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

# 잘 저장됐는 지 확인하기
GET /users/_search 

# 이미 존재하는 id로 데이터 저장하면 어떻게 되는 지 확인하기
POST /users/_create/1
{
  "name": "jscode",
  "age": 30,
  "is_active": true
}

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

# 잘 저장됐는 지 확인하기
GET /users/_search 

# 이미 존재하는 id로 데이터 저장하면 어떻게 되는 지 확인하기
POST /users/_doc/2
{
  "name": "jason2", 
  "age": 30,
  "is_active": true
}

# 어떻게 됐는 지 확인하기
GET /users/_search 

[도큐먼트 조회]

  • 특정 인덱스의 모든 도큐먼트 조회
  • id로 특정 도큐먼트 조회
# GET /{인덱스명}/_search
GET /users/_search

# 특정 도큐먼트 조회
# GET /{index}/_doc/{id}
GET /users/_doc/1
GET /users/_doc/2

[도큐먼트 수정]

  • 도큐먼트를 통째로 덮어씌우기
  • 일부 필드만 수정
 # 기존 도큐먼트 확인
GET /users/_doc/1

# 특정 도큐먼트 수정
# 이 API는 데이터 저장 시에도 사용하는 API이다. (바로 위에서 언급했었음)
# PUT /{인덱스명}/_doc/{id}
PUT /users/_doc/1
{
  "name": "new"
}

# 수정됐는 지 확인하기
GET /users/_doc/1

# 기존 도큐먼트 확인
GET /users/_doc/2

# 특정 도큐먼트 수정
# POST /{인덱스명}/_update/{id}
POST /users/_update/2
{
  "doc": {
	  "age": 10,
	  "is_active": false
  }
}

# 수정됐는 지 확인하기
GET /users/_doc/2

[도큐먼트 삭제]

# 기존 도큐먼트 확인
GET /users/_doc/2

# id로 도큐먼트 삭제하기
# DELETE /{인덱스명}/_doc/{id} 
DELETE /users/_doc/2

# 삭제됐는 지 확인하기
GET /users/_doc/2

Document API