Elastic Search 사용법 #2 (데이터 처리/조회 API)

 

 

1. 기본 명령어 형태

터미널 상에서 Elastic Search에 작업 요청을 보낼때는 linux curl 명령어를 사용하며, 그 뒤로는 작업의 유형을 정의하는 옵션(ex, -XPUT, -XGET)과 리소스(URL) 주소 정보가 뒤따릅니다. 작업 유형 옵션은 HTTP 메서드 형태로 아래와 같이 구분됩니다.

  • -XPUT: 인덱스, document 등 데이터를 추가
  • -XGET: 데이터를 조회
  • -XDELETE: 데이터 제거
  • -XPOST: 데이터 추가/수정

 

2. Index 명령어

Index 작업 관련 명령어 format은 다음과 같습니다.

curl [HTTP 메서드] http://[elastic IP 주소:포트번호]/[index 명]

 

Index 처리/조회 요청

# 인덱스 추가
$ curl -XPUT http://localhost:9200/students

# 인덱스 조회
$ curl -XGET http://localhost:9200/students?pretty

# 인덱스 제거
$ curl -XDELETE http://localhost:9200/students?pretty

 

명령어를 치면 작업 결과를 반환하는데, 보통 아래 이미지처럼 줄이 띄워지지 않은 채로 출력됩니다. 결과물을 좀 더 예쁘게 표시되게하려면, HTTP 리소스 주소 마지막에 ?pretty을 붙이시면 됩니다.

 

 

3. Document 명령어

 

Document는 1번, 2번, ... 순서대로 번호를 부여하여 식별하고, Document 처리 명령어는 아래와 같은 형식을 따릅니다.

curl [HTTP 메서드] http://[elastic IP 주소:포트번호]/[index 명]/[쿼리 유형]/[Document 번호]

 

쿼리 유형의 경우, 

  • Document 생성이면 _create
  • Document 조회 및 삭제는 _doc
  • Document 삭제는 _update

 

Document 처리/조회 요청

# Document 추가, -XPOST를 사용해도 됨
$ curl -XPUT http://localhost:9200/students/_create/1/?pretty \
-d '{"name": "Kim", "age": 21, "major": "bio"}' \
-H 'Content-Type: application/json'

# Document 조회
$ curl -XGET http://localhost:9200/students/_doc/1?pretty

# Document 수정 (필드값 변경)
$ curl -XPOST http://localhost:9200/students/_update/1?pretty \
-d '{"doc": {"major": "eecs"}}' \
-H 'Content-Type: application/json'

# Document 삭제
$ curl -XDELETE http://localhost:9200/students/_doc/1

 

필드 추가/제거

# 필드 추가
$ curl -XPOST http://localhost:9200/students/_update/1?pretty -d \
'{
  "script" : "ctx._source.grade = 3"
}' \
-H 'Content-Type: application/json'

# 필드 제거, 터미널에서 직접 작업할때는 {} 안의 문자열을 \" 로 감싸주기
$ curl -XPOST http://localhost:9200/students/_update/1?pretty -d \
'{
  "script" : "ctx._source.remove(\"grade\")"
}' \
-H 'Content-Type: application/json'

 

필드 연산

# 필드 연산 사용 예
$ curl -XPOST http://localhost:9200/students/_update/1?pretty -d \
'{
  "script" : {
    "source": "ctx._source.age += params.count",
    "params" : {
      "count" : 3
    }
  }
}' \
-H 'Content-Type: application/json'

 

조건문

# if 조건문 사용 예
$ curl -XPOST http://localhost:9200/students/_update/1?pretty -d \
'{
  "script" : {
    "source": "if (ctx._source.grade > 4) { ctx._source.graduated = true } else { ctx._source.graduated = false }"
  }
}' \
-H 'Content-Type: application/json'

 

쿼리를 이용한 데이터 조회

# 필드 'grade' 가 3인 document 검색 (''로 감싸주는 것 주의)
$ curl -XGET 'http://localhost:9200/students/_search?q=grade:3&pretty'

# 위 명령어를 아래처럼 대체 가능
$ curl -XGET http://localhost:9200/students/_search?pretty -d \
'{
	"query": {
		"term": {"grade":3}
	}
}' \
-H 'Content-Type: application/json'

 

 

4. JSON 파일 읽어 데이터 처리 (Bulk)

 

앞서 여러 동작 명령어를 확인해 보았지만, 데이터를 하나 추가하고 조회할 때마다 터미널에 복잡하게 입력해야하는 부분이 여간 불편한게 아니였을 겁니다. curl로 보낼 메시지 바디 내용이 어짜피 JSON 데이터라면 직접 JSON 파일을 전송하는 대안도 있습니다.

 

이럴 때 사용하는 기능이 Bulk 입니다. 아래 예시로 보여드리는 JSON 파일은 Bulk API를 사용하여 Document를 추가하기 위해 갖춰야 하는 데이터 포맷으로 정리되어 있습니다. Document마다 각각 2줄씩, 첫번째 줄은 index 정보와 document 번호를, 뒷 줄은 필드값들을 포함합니다.

# create_list.json
{ "index" : { "_index" : "coders", "_id" : "1" } }
{ "name": "Lee", "school": "MIT", "tier": "master", "rating": 2202 }
{ "index" : { "_index" : "coders", "_id" : "2" } }
{ "name": "Hong", "school": "SNU", "tier": "candidate master", "rating": 1919 }
{ "index" : { "_index" : "coders", "_id" : "3" } }
{ "name": "Shin", "school": "KOR", "tier": "expert", "rating": 1654 }
{ "index" : { "_index" : "coders", "_id" : "4" } }
{ "name": "Park", "school": "STA", "tier": "international grandmaster", "rating": 2927 }

 

Bulk 문법은 elastic search 주소 뒤에 _bulk를 붙인 뒤, —data-binary @[JSON 파일 경로]를 추가하면 됩니다.

# JSON 파일(create_list.json) 통으로 처리 요청 
$ curl -XPOST http://localhost:9200/_bulk --data-binary @create_list.json \
-H 'Content-Type: application/json'

 

Bulk로 함수 연산 요청하기

Bulk는 document 추가 외에도 DB 연산에서 많이 쓰이는 MAX, MIN, AVG, GROUP BY… 등의 함수를 처리할 수 있습니다. 아래 예시는 방금 추가한 document 중에서 rating이라는 필드 항목에서 가장 큰 값을 요청하는 쿼리문입니다.

# op.json
{
	"size": 0,
	"aggs": {
		"highest_rating":{
			"max": {              
				"field": "rating"
			}
		}
	}
}
$ curl -XGET http://localhost:9200/coders/_search?pretty --data-binary @op.json \
-H 'Content-Type: application/json'

 

반응형