[Elasticsearch] Elasticsearch CRUD
✔ 엘라스틱서치 CRUD
클러스터 탐색
Elasticsearch는 클러스터와 상호 작용하는데 사용할 수 있는 REST API 제공
REST API
- 노드와 통신하는 방법
- API로 수행 할 수 있는 몇 가지 작업
- 클러스터, 노드 및 색인 상태, 통계 확인
- 클러스터, 노드, 색인 데이터, 메타 데이터 관리
- CRUD(Create, Read, Update, Delete) 및 인덱스에 대한 검색 작업 수행
- 페이징, 정렬, 필터링, 스크립팅, 집계 및 기타 여러 고급 검색 작업 수행
- 웹의 창시자(HTTP) 중의 한 사람 RoyFelling 2000년 논문에 의해 소개
- 웹의 장점을 최대한 활용할 수 있는 네트워크 기반의 아키텍쳐
-
구성요소 3가지
HTTP POST, http://myweb/users/ { "users" : { "name": "gasbugs" } }
- 리소스 (URI)
- 메서드 (POST)
- 메시지 (위 코드 전체를 표현)
클러스터 상태(Health)
# _언더바 : API를 의미한다, REST API랑은 무관
# _update
# _search
# _cat: 노드의 대한 상태를 출력
# ?v: 상세 정보를 보여준다
GET /_cat/nodes?v
- 클러스터가 어떻게 진행되고 있는지 기본적인 확인
- curl을 사용하여 이를 수행
- HTTP/REST 호출을 수행 할 수 있는 모든 도구를 사용 가능
- 클러스터 상태를 확인하기 위해 _cat API를 사용
- 녹색
- 모든 것이 좋음(클러스터가 완전히 정상 작동 함)
- 노란색
- 모든 데이터를 사용할 수 있지만 일부 복제본은 아직 할당되지 않음
- 클러스터는 작동 된 상황
- 빨간색
- 어떤 이유로든 일부 데이터를 사용할 수 없음
- 클러스터가 부분적으로 작동함
- 빨간색이 나오면 문제가 있다는 의미
데이터베이스가 가진 데이터 확인하기
GET /_cat/indices?v
- 갖고 있는 모든 인덱스 항목 조회
- index는 일반 RDB에서 데이터베이스의 역할
- indecies
- index의 복수형
- 즉, 위 명령어는 데이터베이스를 전부 확인한다는 의미
엘라스틱 데이터베이스의 인덱싱 방식
Index(DataBase)
문서 | 문서 내용 |
---|---|
Doc1 | blue sky green land red sun |
Doc2 | blue ocean green land |
Doc3 | red flower blue sky |
검색어 | 검색어가 가리키는 문서 |
---|---|
blue | Doc1, Doc2, Doc3 |
sky | Doc1, Doc3 |
green | Doc1, Doc2 |
land | Doc1, Doc2 |
red | Doc1, Doc3 |
ocean | Doc2 |
flower | Doc3 |
sun | Doc1 |
- 엘라스틱 서치는 데이터를 역색인하여 저장한다.
- 검색어는 해당 단어가 어느 문서(Document)에 포함이 되어있는지 확인한다.
- blue라는 단어를 검색 시 Doc1, Doc2, Doc3 문서를 가르킨다.
- 데이터의 양이 많아진다는 단점이 있지만, 데이터 검색 속도가 증가한다.
HTTP 메서드와 CRUD, SQL을 비교
HTTP 메서드 | CRUD | SQL |
---|---|---|
GET | Read | Select |
PUT | Update | Update |
POST | Create | Insert |
DELETE | Delete | Delete |
- 해당 열이 Elasticsearch에서 사용이 되는 HTTP 메서드.
- 6.x 부터 PUT이랑 POST를 엄격히 구분하지 않고 사용을 한다.
- Mapping?
- 데이터베이스의 구성요소를 구성한다, 테이블 생성.
- Elasticsearch는 Mapping이 필수 사항이 아니다.
- 하지만 필요한 상황이 존재.
✔ 엘라스틱서치 데이터 처리
엘라스틱서치의 데이터 구조
- 인덱스(Index), 타입(Type), 도큐먼트(Document)의 단위를 가짐
- 도큐먼트는 엘라스틱서치의 데이터가 저장되는 최소 단위
- 여러 개의 도큐먼트는 하나의 타입(테이블)
- 다시 여러 개의 타입은 하나의 인덱스(스키마)로 구성
엘라스틱서치 | 관계형 DB |
---|---|
Index | Database |
Type | Table |
Field | Column |
Document | Row |
Mapping | Scema |
엘라스틱 서치 질의 방법
데이터 입력/조회/삭제/업데이트 요약
6.x 버전부터는 PUT과 POST를 혼용하여 사용한다
데이터 처리 | 메서드 | 구문 |
---|---|---|
입력 | PUT | http://localhost:9200/index1/type1/1 -d ‘{”num”: 1, “name”: “llsun Choi”}’ |
조회 | GET | http://localhost:9200/index1/type1/1 |
삭제 | DELETE | http://localhost:9200/index1/type1/1 |
업데이트 | POST | http://localhost:9200/index1/type1/1 _update -d ‘’{doc: {”age”: 99} }’ |
URI 분석
http://localhost:9200/index1/type1/1 -d ‘{”num”: 1, “name”: “llsun Choi”}’
- index1
- Database 명명
- type1
- 테이블 정의
- 1
- Document(Row)
- -d ‘{”num”: 1, “name”: “llsun Choi”}’
- 메시지 부분
- 메시지는 반드시 key - value 한 쌍으로 들어가야 한다
✔ 인덱스 만들기
Customer Index 생성
PUT /customer?pretty
GET /_cat/indices?v
<curl 명령어>
curl -X PUT "localhost:9200/customer?pretty"
curl -X PUT "localhost:9200/_cat?indices?v"
- 첫 번째 명령은 PUT 동사를 사용하여 “customer”라는 색인을 생성
- JSON 응답 (있을 경우)을 포맷팅하여 출력하도록 끝 부분에 pretty구문 추가
PUT 명령어 실행 시
{
"acknowledged": true,
"shards_acknowledged": true,
"index": "customer"
}
- acknowledged: 응답 결과 정상
- shard_acknowledged:
- index: 생성된 데이터베이스명
GET 명령어로 index 전체 조회
GET /_cat/indices?v
- 전체 인덱스를 조회
GET 명령어 실행 시
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
green open .geoip_databases '' 1 0 43 40 40.8mb 40.8mb
... 중략
- _cat 명령어를 사용하여 전체 index(데이터베이스)를 조회 한다.
POST 명령어 사용하여 데이터 삽입
POST customer/type1/1
{
"name": "ymkim"
}
POST 명령어 실행 시
{
"_index" : "customer",
"_type" : "type1",
"_id" : "1", # document => 지정하지 않을 시 랜덤으로 들어간다
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}
DELETE 명령어로 데이터 삭제
DELETE customer/type1/1
DELETE 명령어 실행 시
{
"_index" : "customer",
"_type" : "type1",
"_id" : "1",
"_version" : 2,
"result" : "deleted", # 삭제 여부
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 1,
"_primary_term" : 1
}
Document의 일부분을 변경
# 아래 명령어를 통해 document의 일부분을 변경할 수 있다
POST customer/type1/1/_update
{
"doc" : {
"age" : 123
}
}
# 해당 명령어는 document 전체를 갈아끼우는 방법이다, 지양해야할 것 같다
POST customer/type1/1
{
"name": "ymkim"
}
Elasticsearch script 사용
POST customer/type1/1/_update
{
"script" : {
"inline": "if(ctx._source.age==123) {ctx._source.age++}"
}
}
- 위와 같이 Javascript 구문을 사용하여 데이터를 핸들링 할 수 있다.
댓글남기기