ElasticSearch 활용 - 기본 명령어 CRUD
2020, Oct 05
- 참고 공식사이트 (한글 번역 되어있으나 버전이 5.4 버전인 관계로 명령어는 현재와 다를 수 있음)
https://www.elastic.co/guide/kr/index.html
초기에는 kibana 명령어를 사용할지 몰라 bash 창에서 명령어를 입력하여 활용하다가 키바나 명령어 사용법을 알게되어 편하게 쓰게 되었다. 혹시 독자분들도 아무것도 모르고 bash 창을 이용하여 명령어를 입력해서 테스트 하고 있다면 [localhost:5601](http://localhost:5601)
로 접속하여 Dev Tools
에서 활용해보자.
클러스터 상태 확인
GET /_cat/health?v
- 녹색 : 모두 양호한 상태
- 노란색 : 모든 데이터가 사용 가능한 상태이지만 일부 리플리카가 아직 배정되지 않은 상태
- 빨간색 : 어떤 이유로 일부 데이터가 사용할 수 없는 상태를 의미
[root@node1 ~]# curl -GET 'localhost:9200/_cat/health?v'
epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1601862088 01:41:28 es-docker-cluster green 3 3 22 11 0 0 0 0 - 100.0%
노드의 목록 표시
GET /_cat/nodes?v
[root@node1 ~]# curl -GET 'localhost:9200/_cat/nodes?v'
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
192.168.96.2 39 58 10 0.24 0.24 0.44 dilmrt - es03
192.168.96.4 18 58 10 0.24 0.24 0.44 dilmrt - es01
192.168.96.3 40 58 10 0.24 0.24 0.44 dilmrt * es02
모든 index 나열
[root@node1 ~]# curl -GET 'localhost:9200/_cat/indices?v'
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
green open .kibana-event-log-7.9.2-000001 fr2XopZHRzuJcm9pCvPqAA 1 1 3 0 32.5kb 16.2kb
green open .apm-custom-link CzinLMWrRe-S-LDpILSc6w 1 1 0 0 416b 208b
green open .kibana_task_manager_2 DEn7MKdTQviDvaSZ56NBDA 1 1 6 263 1.2mb 684.2kb
green open .kibana_task_manager_1 f8ibyRa5Qc-msi2MA55Pqg 1 1 5 2 55.4kb 27.7kb
green open index_test np_2WyhCSTaBWlGiqBmHWw 1 1 1 0 9.7kb 4.8kb
green open .apm-agent-configuration cTW1RYPFRG6cYP4Wg_Gwxw 1 1 0 0 416b 208b
green open customer2 xmXw2qqdTnegGjBHNmH-BQ 1 1 2 0 14.9kb 7.4kb
green open .kibana_2 ec72UHa5TQSyIWMT87PW8Q 1 1 17 0 20.8mb 10.4mb
green open .kibana_1 YRg6LxJKQf6DEUebuGCtBg 1 1 4 0 65.4kb 32.7kb
index 생성 및 조회
PUT /customer?pretty
(끝에 pretty를 추가할 경우 결과 값을 예쁘게 표현)GET /_cat/indices?v
## 색인 생성 후 조회 결과
[root@node1 ~]# curl -GET 'localhost:9200/_cat/indices?v'
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
green open .kibana-event-log-7.9.2-000001 fr2XopZHRzuJcm9pCvPqAA 1 1 3 0 32.5kb 16.2kb
green open .apm-custom-link CzinLMWrRe-S-LDpILSc6w 1 1 0 0 416b 208b
green open .kibana_task_manager_2 DEn7MKdTQviDvaSZ56NBDA 1 1 6 272 1.3mb 653.3kb
green open .kibana_task_manager_1 f8ibyRa5Qc-msi2MA55Pqg 1 1 5 2 55.4kb 27.7kb
green open index_test np_2WyhCSTaBWlGiqBmHWw 1 1 1 0 9.7kb 4.8kb
green open .apm-agent-configuration cTW1RYPFRG6cYP4Wg_Gwxw 1 1 0 0 416b 208b
green open customer2 xmXw2qqdTnegGjBHNmH-BQ 1 1 2 0 14.9kb 7.4kb
green open .kibana_2 ec72UHa5TQSyIWMT87PW8Q 1 1 17 0 20.8mb 10.4mb
green open .kibana_1 YRg6LxJKQf6DEUebuGCtBg 1 1 4 0 65.4kb 32.7kb
green open customer _CovbT7iQ_mE_TAI-Exiiw 1 1 0 0 416b 208b
문서 index 및 데이터 삽입
- 한글 공식 문서를 보고 명령어를 입력하였더니 Deprecation이 발생한 것을 알 수 있었다. type은 현재 사용하지 않으므로 다른 방식의 명령어를 입력해주어야 한다.
PUT /customer/external/1?pretty
{
"name": "John Doe"
}
#! Deprecation: [types removal] Specifying types in document index requests is deprecated, use the typeless endpoints instead (/{index}/_doc/{id}, /{index}/_doc, or /{index}/_create/{id}).
{
"_index" : "customer",
"_type" : "external",
"_id" : "1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 2,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}
- 아래와 같이
PUT /customer/_doc/3?pretty
로 명령어를 변경한다. type이 불필요하여 타입 대신_doc
을 넣는 것으로 변경된 듯 하다.
PUT /customer/_doc/3?pretty
{
"name": "John Doe"
}
{
"_index" : "customer",
"_type" : "_doc",
"_id" : "3",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 2,
"failed" : 0
},
"_seq_no" : 3,
"_primary_term" : 1
}
- 방금 색인화한 문서를 검색하는 것도 명령어가 달라져서 아래와 같이 입력하면 된다. (역시 중간에 _doc를 넣어서 type을 사용하지 않음을 알 수 있다)
GET /customer/_doc/1?pretty
{
"_index" : "customer",
"_type" : "_doc",
"_id" : "1",
"_version" : 2,
"_seq_no" : 1,
"_primary_term" : 1,
"found" : true,
"_source" : {
"name" : "John Doe"
}
}
index 삭제
- 아래의 DELETE 명령어로 customer 색인을 삭제하고 다시 모든 색인을 조회하면 아래와 같이 customer 색인이 보이지 않는 것을 확인할 수 있다.
DELETE /customer?pretty
GET /_cat/indices?v
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
green open .kibana-event-log-7.9.2-000001 fr2XopZHRzuJcm9pCvPqAA 1 1 3 0 32.5kb 16.2kb
green open .apm-custom-link CzinLMWrRe-S-LDpILSc6w 1 1 0 0 416b 208b
green open .kibana_task_manager_2 DEn7MKdTQviDvaSZ56NBDA 1 1 6 395 1.2mb 680.7kb
green open .kibana_task_manager_1 f8ibyRa5Qc-msi2MA55Pqg 1 1 5 2 55.4kb 27.7kb
green open index_test np_2WyhCSTaBWlGiqBmHWw 1 1 1 0 9.7kb 4.8kb
green open .apm-agent-configuration cTW1RYPFRG6cYP4Wg_Gwxw 1 1 0 0 416b 208b
green open .kibana_2 ec72UHa5TQSyIWMT87PW8Q 1 1 30 11 20.8mb 10.4mb
green open .kibana_1 YRg6LxJKQf6DEUebuGCtBg 1 1 4 0 65.4kb 32.7kb
index 데이터 대체
- 동일한 명령어로 내용만 바꿔서 실행했을 경우 기존 문서가 새 문서를 대체
John Doe
가Jane Doe
로 변경된 것을 알 수 있음
PUT /customer/_doc/1?pretty
{
"name": "Jane Doe"
}
GET /customer/_doc/1?pretty
{
"_index" : "customer",
"_type" : "_doc",
"_id" : "1",
"_version" : 3,
"_seq_no" : 2,
"_primary_term" : 1,
"found" : true,
"_source" : {
"name" : "Jane Doe"
}
}
문서 업데이트
- 이 명령어도 기존 명령어와 변경된 것을 확인할 수 있음
- 업데이트를 명령하면 기존 문서 삭제, 새 문서를 색인화, 업데이트 적용
# 기존 명령어
POST /customer/external/1/_update?pretty
{
"doc": { "name": "Jane Doe" }
}
# 변경된 명령어
POST /customer/_update/1?pretty
{
"doc": { "name": "John Doe" }
}
GET /customer/_doc/1?pretty
{
"_index" : "customer",
"_type" : "_doc",
"_id" : "1",
"_version" : 4,
"_seq_no" : 3,
"_primary_term" : 1,
"found" : true,
"_source" : {
"name" : "John Doe"
}
}
- 이름을
Jane Doe
로 변경하고age
필드를 추가
# 기존 명령어
POST /customer/external/1/_update?pretty
{
"doc": { "name": "Jane Doe", "age": 20 }
}
# 변경된 명령어
POST /customer/_update/1?pretty
{
"doc": { "name": "Jane Doe", "age" : 20 }
}
GET /customer/_doc/1?pretty
{
"_index" : "customer",
"_type" : "_doc",
"_id" : "1",
"_version" : 6,
"result" : "updated",
"_shards" : {
"total" : 2,
"successful" : 2,
"failed" : 0
},
"_seq_no" : 5,
"_primary_term" : 1
}
- 스크립트를 사용하여 나이를 5만큼 늘리기
# 기존 명령어
POST /customer/external/1/_update?pretty
{
"script" : "ctx._source.age += 5"
}
# 변경된 명령어
POST /customer/_update/1?pretty
{
"script": "ctx._source.age += 5"
}
GET /customer/_doc/1?pretty
{
"_index" : "customer",
"_type" : "_doc",
"_id" : "1",
"_version" : 7,
"_seq_no" : 6,
"_primary_term" : 1,
"found" : true,
"_source" : {
"name" : "Jane Doe",
"age" : 25
}
}
문서 삭제
# 기존 명령어
DELETE /customer/external/2?pretty
# 변경된 명령어
DELETE /customer/_doc/1?pretty
GET /customer/_doc/1?pretty
{
"_index" : "customer",
"_type" : "_doc",
"_id" : "1",
"found" : false
}