[ElasticSearch] ES 데이터 처리

donghyeok·2022년 12월 22일

ElasticSearch

목록 보기
3/8

REST API 지원

ES는 REST API를 지원한다. 자원별로 고유 URL 접근을 하고 http 메서드 PUT, POST, GET, DELETE를 이용해서 RESTful한 시스템을 지원한다. 예시는 다음과 같다.

입력 : PUT http://user.com/kim -d {"name":"kim", "age":38, "gender":"m"}
조회 : GET http://user.com/kim
삭제 : DELETE http://user.com/kim

CRUD - 입력, 조회, 수정, 삭제

ES에서는 단일 도큐먼트로 고유 URL을 갖습니다. 도큐먼트 접근 URL은
http://{호스트}:{포트}/{인덱스}/_doc/{도큐먼트 id} 구조로 되어 있다. (ES 7.0 이후)

입력(PUT)

데이터를 입력할때는 PUT 메서드를 이용한다.
my_index 인덱스에 도큐먼트 id가 1인 데이터를 입력하는 예제는 다음과 같다.

PUT my_index/_doc/1
{
 	"name" : "Im dong hyeok",
  	"message" : "hi ES"
}

최초로 도큐먼트를 입력하면 "result" : "created" 표시가 되며
동일 도큐먼트에 다른 내용을 입력하면 "result" : "updated"가 표시되며 이는 업데이트문이다.
실수로 업데이트하는 것을 막기위해 _doc 대신 _create를 사용할 수 있다.

조회(GET)

GET 메서드로 도큐먼트의 내용을 가져오며 도큐먼트 내용은 "_source" 항목에 표시된다.

GET my_index/_doc/1

삭제(DELETE)

DELETE 메서드를 이용해서 도큐먼트 또는 인덱스 삭제가 가능하다.

DELETE my_index/_doc/1   //도큐먼트 삭제 
DELETE my_index			 //인덱스 삭제 

위 두 경우 실수로 조회시 차이가 있는데, 인덱스는 있고 도큐먼트가 없을 경우 "found" : false응답을, 인덱스가 없을 경우 "type" : "index_not_found_exception" , "status" : 404 오류가 리턴된다.

수정(POST)

POST 메서드는 PUT 메서드와 유사하게 데이터 입력에 사용이 가능하다.
하지만 차이가 있는데 POST 메서드로 {인덱스}/_doc 까지만 입력하면 임의 도큐먼트id가 자동 생성된다.

POST my_index/_doc
{
 	"name":"im dong hyeok",
  	"message":"hi ES"
}

추가로, PUT으로 도큐먼트를 수정할때는 도큐먼트 내용을 매번 다시 입력해줘야 한다.
POST로 도큐먼트를 수정할때는 {인덱스}/_update/{도큐먼트 id} 명령을 이용해서 원하는 필드만 업데이트 가능하다. 업데이트 내용에는 "doc" 지정자를 사용한다.

POST my_index/_update/1
{
 	"doc" : {
     	"message":"안녕 ES" 
    }
}

벌크 API

여러 명령을 배치로 수행하기 위해서 bulk API 사용이 가능하다.
벌크 동작은 따로따로 수행하는 것보다 속도가 훨씬 빠르며 대량의 데이터를 입력할 때는 반드시 bulk API를 사용해야 오버헤드가 없다.
bulk API에는 index, create, update, delete 동작이 가능하며 delete를 제외하고 명령문과 데이터문을 한 줄씩 순서대로 입력해야 한다.

POST _bulk
{"index":{"_index":"test", "_id":"1"}}    //명령문   -> test/_doc/1 에 입력
{"field":"value one"}					  //데이터문  -> "field" : "value one" 입력 
{"index":{"_index":"test", "_id":"2"}}
{"field":"value two"}
{"delete":{"_index":"test", "_id":"2"}}
{"create":{"_index":"test", "_id":"3"}}
{"field":"value three"}
{"update":{"_index":"test", "_id":"1"}}
{"doc":{"field":"value two"}}

검색 API

ES의 진가는 쿼리를 통한 검색기능에 있다. 검색은 인덱스 단위로 이루어지며 GET {인덱스명}/_search 형식으로 사용한다. 쿼리를 사용하지 않으면 전체 스캔을 하는 match_all 검색을 한다.

URI 검색

_search 뒤에 q 파라미터를 사용하여 검색어를 입력할 수 있다.
test 인덱스의 "value"라는 값을 검색하기 위해서는 다음과 같이 입력한다.

GET test/_search?q=value

결과에는 hits.total.value부분에 검색 결과 전체에 해당되는 문서 개수가 표시되고 그 안의 hits:[] 구문 안에 배열로 가장 정확도(relevancy)가 높은 문서 10개가 노출된다
URI 쿼리에서는 AND, OR, NOT의 사용이 가능하다
검색은 항상 아래처럼 필드를 지정해서 하는 것이 좋다.

GET test/_search?q=value AND three     //value, three를 모두 포함 
GET test/_search?q=field.value.  	   //field 필드 값이 value인 도큐먼트 

데이터 본문 검색

데이터 본문 검색은 자주 사용되는 ES의 queryDSL을 사용하며 쿼리 또한 json 형식으로 되어 있다.
가장 쉽고 많이 사용하는 것은 match 쿼리이다. 예시는 다음과 같다.

GET test/_search
{
	"query" : {
    	"match" : {
        	"field": "value"
        }
    }
}

쿼리 입력은 항상 query 지정자로 시작한다.

멀티테넌시 (Multitenancy)

ES는 여러 인덱스를 한번에 묶어서 검색하는 멀티테넌시를 지원한다.
logs-2022-10, logs-2022-11 과 같이 날짜별로 저장된 인덱스들이 있다면
이 인덱스들을 모두 logs-*/_search 명령으로 한번에 검색이 가능하다.
여러 인덱스는 ,로 나열하거나 와일드카드*로 묶을 수 있다.

GET logs-2022-10,2022-11/_search
GET logs-2022-*/_search

출처 : https://esbook.kimjmin.net/

0개의 댓글