[ElasticSearch] Mapping
by youngjun._.
실습 환경
- 💡 Elasticsearch 7.9.0
- 💡 Windows 10
- 💡 Git Bash
Mapping
은 RDB에서 스키마와 같은 개념이다.
이전 포스팅에서 살펴본 것처럼 Mapping
없이도 데이터를 넣고 읽을 수 있었다.
하지만 실제로 서비스를 할 때 Mapping
을 하지 않을 경우 여러 문제가 발생할 수 있다.
- Document에 날짜를 넣고 싶은데 단순히 텍스트로 들어간다.
와 같은 상황에 Kibana
등의 가시화 도구와 분석을 할 때 타입이 맞지 않는 문제가 대표적이다.
실습에서 사용할 데이터는 다음과 같다.
Mapping
실습을 하기위해 Index를 먼저 삭제한 이후에 다시 생성하겠다.
1. Index 삭제하고 다시 만들기
✔ 삭제하기
$ curl -XDELETE http://localhost:9200/classes?pretty
✔ 생성하기
$ curl -XPUT http://localhost:9200/classes?pretty
✔ 확인하기
$ curl -XGET http://localhost:9200/classes?pretty
결과를 보면 mappings
부분이 비어있는 것을 확인할 수 있다.
{ "classes" : { "aliases" : { }, "mappings" : { }, "settings" : { "index" : { "creation_date" : "1598314352997", "number_of_shards" : "1", "number_of_replicas" : "1", "uuid" : "vLmOaHZLRMW_7kOZbi0ZRg", "version" : { "created" : "7090099" }, "provided_name" : "classes" } } } }
2. Mapping 생성하기
Mapping
으로 데이터 타입을 미리 지정해주기 위해 mapping JSON 파일이 있어야한다.
참고한 강의에서는 mapping type을
string
으로 주었는데 이는 6.x 버전부터text
로 바뀌었다. 자세한 내용을 보고싶다면 포스팅 중 Error-handling을 확인하거나, stackoverflow 내용을 읽어볼 것을 권장한다.
{ "class" : { "properties" : { "title" : { "type" : "text" }, "professor" : { "type" : "text" }, "major" : { "type" : "text" }, "semester" : { "type" : "text" }, "student_count" : { "type" : "integer" }, "unit" : { "type" : "integer" }, "rating" : { "type" : "integer" }, "submit_date" : { "type" : "date", "format" : "yyyy-MM-dd" }, "school_location" : { "type" : "geo_point" } } } }
다음과 같은 JSON
파일로 mapping 시켜보자.
X PUT 명령어를 사용해 mapping을 생성한다. 다음과 같이 입력하면 된다.
curl -XPUT 'http://localhost:9200/classes/class/_mapping' -d @classesRating_mapping.json
지난 포스팅과 마찬가지로 Windows에서는 Content-Type 을 H 옵션으로 입력해줘야한다.
그리고 7.x 버전은 공식 문서에 나와있는 것과 같이 무형식 API를 사용하므로 include_type_name=true
를 추가해주어야 한다.
$ curl -XPUT 'http://localhost:9200/classes/class/_mapping?include_type_name=true&pretty' -d @classesRating_mapping.json -H 'Content-Type: application/json'
Error 없이 정상적으로 수행됐다면 class 타입에 mapping이 추가된 것이다.
확인해보자!
$ curl -XGET http://localhost:9200/classes?pretty
결과
{ "classes" : { "aliases" : { }, "mappings" : { "properties" : { "major" : { "type" : "text" }, "professor" : { "type" : "text" }, "rating" : { "type" : "integer" }, "school_location" : { "type" : "geo_point" }, "semester" : { "type" : "text" }, "student_count" : { "type" : "integer" }, "submit_date" : { "type" : "date", "format" : "yyyy-MM-dd" }, "title" : { "type" : "text" }, "unit" : { "type" : "integer" } } }, "settings" : { "index" : { "creation_date" : "1598314352997", "number_of_shards" : "1", "number_of_replicas" : "1", "uuid" : "vLmOaHZLRMW_7kOZbi0ZRg", "version" : { "created" : "7090099" }, "provided_name" : "classes" } } } }
참고로 type 중 geo_point
는 지도에 실제 위치를 띄어줄 수 있는 type이다.
3. 실제 데이터를 Index에 bulk하기
여러 Document
를 bulk
로 한번에 넣어보자.
✔ Bulk 하기
$ curl -XPOST http://localhost:9200/_bulk?pretty --data-binary @classes.json -H 'Content-Type: application/json'
✔ 확인하기
$ curl -XGET http://localhost:9200/classes/class/1/?pretty
결과
{ "_index" : "classes", "_type" : "class", "_id" : "1", "_version" : 1, "_seq_no" : 0, "_primary_term" : 1, "found" : true, "_source" : { "title" : "Machine Learning", "Professor" : "YoungJun Park", "major" : "Computer Science", "semester" : [ "spring", "fall" ], "student_count" : 100, "unit" : 3, "rating" : 5, "submit_date" : "2020-01-02", "school_location" : { "lat" : 36.0, "lon" : -120.0 } } }
Mapping type이 정상적으로 입력된 것을 확인할 수 있다!
본 포스팅은
Inflearn
의 ELK 스택 (ElasticSearch, Logstash, Kibana) 으로 데이터 분석 강의를 참고하여 작성되었습니다.
블로그의 정보
개발하는만두
youngjun._.