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
'Backend > ELK Stack' 카테고리의 다른 글
[ELK] CentOS7 ELK 설치(Elasticsearch, Logstash, Kibana) (0) | 2022.02.05 |
---|---|
[elasticsearch] Content-Type header [application/x-www-form-urlencoded] is not supported (406 에러) (0) | 2022.01.17 |