본문으로 바로가기

0. 환경

  • CentOS7
  • JDK 11(Java 11)
  • elasticsearch 7.16.2
  • jq(Json Parser)

 

1. 관련 용어 정리

[Index]

  • 인덱스는 도큐먼트를 저장하는 논리적 단위
  • 관계형 데이터베이스의 테이블과 유사한 개념
  • 동일한 인덱스에 있는 도큐먼트는 동일한 스키마(매핑)를 갖습니다.
  • 모든 도큐먼트는 반드시 하나의 인덱스에 포함돼야 한다.

 

[Document]

  • 실제 데이터를 저장하는 단위
  • 도큐먼트는 엘라스틱서치에서 데이터가 저장되는 기본 단위로 JSON 형태입니다.
  • 하나의 도큐먼트는 여러 필드와 값을 갖습니다.

 

[REST API]

  • 엘라스틱서치의 모든 기능은 REST API 형태입니다.
  • 모든 요청과 응답을 REST API 형태로 제공합니다.
  • 키바나 환경이 구축되어있다면 Dev Tools를 활용하여 엘라스틱서치를 사용할 수 있습니다.
  • CLI 환경에서는 CURL 사용법을 알고 있어야 합니다.

 

[HTTP METHOD]

  • GET 해당 리소스를 조회한다.
  • POST 해당 리소스를 추가한다.
  • PUT 해당 리소스를 수정한다.
  • DELETE 해당 리소스를 삭제한다.

 

[CURL 간단 사용법]

[형태]

curl [options...]  형식

 

[주로 사용할 curl 옵션]

-k --insecure : https 사이트를 SSL certificate 검증 없이 연결
-d --data : HTTP Post나 Put형태로 http request body 형태로 data를 전달할 때 사용합니다.
-X --request : Request method(GET, POST, PUT, PATCH, DELETE)를 기술
-H -header : 헤더 설정

2. jq 설치

curl을 이용하여 CLI환경에서 엘라스틱서치를 이용할 것이므로 결괏값을 보기 좋은 형태로 받기 위해 jq를 설치합니다.

# yum install epel-release

# yum install jq

 

[jq 활용]

[jq 사용하지 않음]
# curl -X GET localhost:9200/stock_sale_log/_mappings
{"stock_sale_log":{"mappings":{"properties":{"name":{"type":"text"},"ticker":{"type":"keyword"},"time":{"type":"date","format":"yyyy-MM-dd HH:mm:ss"}

[jq 사용함]
# curl -X GET localhost:9200/stock_sale_log/_mappings | jq
{
  "stock_sale_log": {
    "mappings": {
      "properties": {
        "name": {
          "type": "text"
        },
        "ticker": {
          "type": "keyword"
        },
        "time": {
          "type": "date",
          "format": "yyyy-MM-dd HH:mm:ss"
        },
        "type": {
          "type": "keyword"
        }
      }
    }
  }
}

3. 테스트용 인덱스, 도큐먼트 구조

테스트에 사용할 인덱스와 도큐먼트 스키마(매핑)는 다음과 같습니다.

 

[Index 이름]

stock_sale_log

 

[Document mapping 형태(Json)]

[Document]
{
  "name": "hj",
  "sale_type": "buy",
  "ticker": "aapl",
  "price": 170,
  "cnt": 10,
  "time": "2022-01-03 18:20:11"
}

{
  "name": "jk",
  "sale_type": "sell",
  "ticker": "aapl",
  "price": 178,
  "cnt": 10,
  "time": "2022-01-05 18:20:20"
}

[Mapping]
{
  "mappings": {
    "properties": {
      "name": {"type": "text"},
      "sale_type": {"type": "keyword"},
      "ticker": {"type": "keyword"},
      "price": {"type": "long"},
      "cnt": {"type": "long"},
      "time": {"type": "date", "format": "yyyy-MM-dd HH:mm:ss"}
    }
  }
}

4. Index CRUD

1. Index 생성

  • mapping 정보를 포함해서 Index를 생성합니다. (명시적 매핑)
  • mapping을 생략하고 인덱싱 되는 도큐먼트의 키와 값에 의해 자동으로 매핑을 적용할 수도 있습니다.
# curl -X PUT \
-H "Content-Type: application/json" \
-d '{"mappings":{"properties":{"name":{"type":"text"},"sale_type":{"type":"keyword"},"ticker":{"type":"keyword"},"price":{"type":"long"},"cnt":{"type":"long"},"time":{"type":"date","format":"yyyy-MM-dd HH:mm:ss"}}}}' \
localhost:9200/stock_sale_log | jq

{
  "acknowledged": true,
  "shards_acknowledged": true,
  "index": "stock_sale_log"
}

 

2. Index 조회

  • 인덱스의 설정 값이나 매핑 값들을 확인할 수 있습니다.
[인덱스의 모든 정보 조회]
# curl -X GET localhost:9200/stock_sale_log | jq

{
  "stock_sale_log": {
    "aliases": {},
    "mappings": {
        (. . .) 생략
    },
    "settings": {
        (. . .) 생략
    }
  }
}
[mappings 정보만 조회]
# curl -X GET localhost:9200/stock_sale_log/_mappings | jq

{
  "stock_sale_log": {
    "mappings": {
      "properties": {
        "cnt": {
          "type": "long"
        },
        "name": {
          "type": "text"
        },
        "price": {
          "type": "long"
        },
        "sale_type": {
          "type": "keyword"
        },
        "ticker": {
          "type": "keyword"
        },
        "time": {
          "type": "date",
          "format": "yyyy-MM-dd HH:mm:ss"
        }
      }
    }
  }
}

 

3. Index 삭제

  • 인덱스를 삭제하면 인덱스에 저장되어 있는 도큐먼트들도 모두 삭제됩니다.
# curl -X DELETE \
localhost:9200/stock_sale_log | jq

{
  "acknowledged": true
}

5. Document CRUD

1. Document 생성(CREATE)

  • 도큐먼트를 인덱스에 포함시키는 것을 인덱싱이라고 합니다.
  • 인덱스가 없을 경우 Document 생성 시 인덱스도 다이나믹 매핑으로 자동으로 생성됩니다.
  • 다이나믹 매핑(Dynamic): 도큐먼트의 필드와 값을 보고 자동으로 데이터 타입을 매핑합니다. 

1. Document 생성(PUT - Document ID 지정)

[PUT을 이용해 id를 지정하여 생성]
# curl -X PUT \
-d '{"name":"hj","sale_type":"buy","ticker":"aapl","price":170,"cnt":10,"time":"2022-01-03 18:20:11"}' \
-H "Content-Type: application/json" \
localhost:9200/stock_sale_log/_doc/1 | jq

{
  "_index": "stock_sale_log",
  "_type": "_doc",
  "_id": "1",
  ( . . . ) 생략
}

2. Document 생성(POST - Document ID 자동 생성)

[POST를 이용해 ID 지정없이 생성(ID 자동 생성)]
# curl -X POST \
-d '{"name":"jk","sale_type":"sell","ticker":"aapl","price":178,"cnt":10,"time":"2022-01-05 18:20:20"}' \
-H "Content-Type: application/json" \
localhost:9200/stock_sale_log/_doc | jq

{
  "_index": "stock_sale_log",
  "_type": "_doc",
  "_id": "ZaW-Yn4BKwQ-4NCaaclg",
  ( . . . ) 생략
}

3. Document 생성(형 변환 -> 문자형 숫자 형 변환)

# curl -X POST \
-d '{"name":"mj","sale_type":"sell","ticker":"msft","price":"178","cnt":"10","time":"2022-01-05 18:20:20"}' \
-H "Content-Type: application/json" \
localhost:9200/stock_sale_log/_doc | jq

 

2. Document 조회(SELECT)

1. 도큐먼트 ID 이용한 조회

# curl -X GET localhost:9200/stock_sale_log/_doc/1 | jq

{
  "_index": "stock_sale_log",
  "_type": "_doc",
  "_id": "1",
  ( . . . ) 생략
}

# curl -X GET localhost:9200/stock_sale_log/_doc/ZaW-Yn4BKwQ-4NCaaclg | jq

{
  "_index": "stock_sale_log",
  "_type": "_doc",
  "_id": "ZaW-Yn4BKwQ-4NCaaclg",
  ( . . . ) 생략
}

2. 쿼리 DSL 활용

[모두 조회]
# curl -X GET localhost:9200/stock_sale_log/_search | jq

[value 값이 jk인 Document 검색]
# curl -X GET localhost:9200/stock_sale_log/_search?q=jk | jq

[name 필드 값이 jk인 Document 검색]
# curl -X GET localhost:9200/stock_sale_log/_search?q=name:jk | jq

[match를 이용한 전문 검색]
# curl -X GET \
-H "Content-Type: application/json" \
-d '{"query": {"match": {"name": "hj"}}}' \
localhost:9200/stock_sale_log/_search | jq

 

3. Document 수정(UPDATE)

1. 특정 ID Document 수정

# curl -X PUT \
-d '{"name":"jk","sale_type":"sell","ticker":"aapl","price":178,"cnt":10,"time":"2022-01-05 18:20:20"}' \
-H "Content-Type: application/json" \
localhost:9200/stock_sale_log/_doc/1 | jq

2. update API를 이용한 업데이트

# curl -X POST \
-d '{"doc": {"cnt": 1} }' \
-H "Content-Type: application/json" \
localhost:9200/stock_sale_log/_update/1 | jq

{
  "_index": "stock_sale_log",
  "_type": "_doc",
  "_id": "1",
  "_version": 5,
  "result": "updated",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 4,
  "_primary_term": 1
}

 

4. Document 삭제(DELETE)

# curl -X DELETE \
-H "Content-Type: application/json" \
localhost:9200/stock_sale_log/_doc/1 | jq