ElasticSearch Index templates
Index template은 새로운 index가 생성될 때에, index 설정 또는 특정 필드의 데이터 타입을 정의해준다.
ElasticSearch에 Logstash 등 수집기로 데이터 수집 전 index가 사전 생성될 필요가 없다. 그런데 그냥 수집하면 숫자나 날짜는 알아서 파싱을 하는데 나머지 대부분은 text로 해석한다.
index template를 생성함으로써 index별로 Shard 갯수나 특정 필드에 대한 개별적인 관리를 할 수 있다.
rdbms의 ddl은 아니지만 비슷한 느낌.
https://www.elastic.co/guide/en/elasticsearch/guide/2.x/index-templates.html#index-templates
template 유무에 따라 index 차이 확인
아래와 같이 /twitter/_doc/1 데이터 생성하면,
[elastic@node5 es_test]$ curl -X PUT "node5.big:9200/twitter/_doc/1?pretty" -H 'Content-Type: application/json' -d'
{
"user" : "kimchy",
"post_date" : "2009-11-15T14:12:12",
"message" : "trying out Elasticsearch"
}
'
다음과 같이 추가된 데이터를 확인할 수 있다.
[elastic@node5 es_test]$ curl -X GET 'node5.big:9200/twitter/_doc/1?pretty'
{
"_index" : "twitter",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"found" : true,
"_source" : {
"user" : "kimchy",
"post_date" : "2009-11-15T14:12:12",
"message" : "trying out Elasticsearch"
}
}
이 때에 twitter 인덱스의 매핑/세팅 정보는 다음과 같다.
[elastic@node5 es_test]$ curl -X GET 'node5.big:9200/twitter/_mapping/?pretty'
{
"twitter" : {
"mappings" : {
"_doc" : {
"properties" : {
"message" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"post_date" : {
"type" : "date"
},
"user" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
}
}
}
[elastic@node5 es_test]$ curl -X GET 'node5.big:9200/twitter/_settings/?pretty'
{
"twitter" : {
"settings" : {
"index" : {
"creation_date" : "1534209610122",
"number_of_shards" : "5",
"number_of_replicas" : "1",
"uuid" : "aO685Uu2T8OCnxnsXzMF8w",
"version" : {
"created" : "6020499"
},
"provided_name" : "twitter"
}
}
}
}
기존 생성된 Twitter 인덱스를 삭제하고
[elastic@node5 es_test]$ curl -X DELETE "node5.big:9200/twitter?pretty"
{
"acknowledged" : true
}
다음과 같이 template_twitter 를 사전 생성한 뒤
[elastic@node5 es_test]$ curl -X PUT "node5.big:9200/_template/template_twitter?pretty" -H 'Content-Type: application/json' -d'
{
"template" : "twitter*",
"mappings" : {
"_doc": {
"properties": {
"message": {
"type": "text"
},
"post_date": {
"type": "text"
},
"user": {
"type": "text"
}
}
}
},
"settings": {
"number_of_shards": 2
}
}
'
데이터를 다시 생성하면
[elastic@node5 es_test]$ curl -X PUT "node5.big:9200/twitter/_doc/1?pretty" -H 'Content-Type: application/json' -d'
{
"user" : "kimchy",
"post_date" : "2009-11-15T14:12:12",
"message" : "trying out Elasticsearch"
}
'
아래와 같이 데이터는 동일하게 조회가 되면서
[elastic@node5 es_test]$ curl -X GET 'node5.big:9200/twitter/_doc/1?pretty'
{
"_index" : "twitter",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"found" : true,
"_source" : {
"user" : "kimchy",
"post_date" : "2009-11-15T14:12:12",
"message" : "trying out Elasticsearch"
}
}
매핑/세팅 정보가 다르다.
[elastic@node5 es_test]$ curl -X GET 'node5.big:9200/twitter/_mapping/?pretty'
{
"twitter" : {
"mappings" : {
"_doc" : {
"properties" : {
"message" : {
"type" : "text"
},
"post_date" : {
"type" : "text"
},
"user" : {
"type" : "text"
}
}
}
}
}
}
[elastic@node5 es_test]$ curl -X GET 'node5.big:9200/twitter/_settings/?pretty'
{
"twitter" : {
"settings" : {
"index" : {
"creation_date" : "1534209219667",
"number_of_shards" : "2",
"number_of_replicas" : "1",
"uuid" : "-eN170knQYWVKRjZplPSVw",
"version" : {
"created" : "6020499"
},
"provided_name" : "twitter"
}
}
}
}
geo_point
location 이라는 필드에 수집되는 데이터는 좌표계 값이다. kibana, visualize > maps 기능에서 사용하기 위해서는 geo_point 라는 데이터타입으로 수집되어야 하므로 template 을 생성해서 해당 필드에 수집되는 데이터는 text가 아닌 geo_point 로 파싱하도록 설정할 수 있다.
curl -X PUT "node5.big:9200/_template/template_accident" -H 'Content-Type: application/json' -d'
{
"template" : "accident*",
"mappings" : {
"accident": {
"properties": {
"location": { "type": "geo_point" },
"involvedCount": { "type": "double" }
}
}
}
}
'
curl -X GET 'node5.big:9200/_template/template_accident?pretty'
{
"template_accident" : {
"order" : 0,
"index_patterns" : [
"accident*"
],
"settings" : { },
"mappings" : {
"accident" : {
"properties" : {
"location" : {
"type" : "geo_point"
},
"involvedCount" : {
"type" : "double"
}
}
}
},
"aliases" : { }
}
}
.monitoring-kibana
아래의 .monitoring-kibana
템플릿은 kibana의 x-pack 을 활성화하면서 생성된 템플릿인데 각 항목들을 알아두면 좋을 것 같다.
[elastic@node5 ~]$ curl -X GET 'node5.big:9200/_template/.monitoring-kibana?pretty'
{
".monitoring-kibana" : {
"order" : 0,
"version" : 6020099,
"index_patterns" : [
".monitoring-kibana-6-*"
],
"settings" : {
"index" : {
"format" : "6",
"codec" : "best_compression",
"number_of_shards" : "1",
"auto_expand_replicas" : "0-1",
"number_of_replicas" : "0"
}
},
"mappings" : {
"doc" : {
"dynamic" : false,
"properties" : {
"cluster_uuid" : {
"type" : "keyword"
},
"timestamp" : {
"type" : "date",
"format" : "date_time"
},
"interval_ms" : {
"type" : "long"
},
"type" : {
"type" : "keyword"
},
"source_node" : {
"properties" : {
"uuid" : {
"type" : "keyword"
},
"host" : {
"type" : "keyword"
},
"transport_address" : {
"type" : "keyword"
},
"ip" : {
"type" : "keyword"
},
"name" : {
"type" : "keyword"
},
"timestamp" : {
"type" : "date",
"format" : "date_time"
}
}
},
"kibana_stats" : {
"properties" : {
"kibana" : {
"properties" : {
"uuid" : {
"type" : "keyword"
},
"name" : {
"type" : "keyword"
},
"host" : {
"type" : "keyword"
},
"transport_address" : {
"type" : "keyword"
},
"version" : {
"type" : "keyword"
},
"snapshot" : {
"type" : "boolean"
},
"status" : {
"type" : "keyword"
},
"statuses" : {
"properties" : {
"name" : {
"type" : "keyword"
},
"state" : {
"type" : "keyword"
}
}
}
}
},
"cloud" : {
"properties" : {
"name" : {
"type" : "keyword"
},
"id" : {
"type" : "keyword"
},
"vm_type" : {
"type" : "keyword"
},
"region" : {
"type" : "keyword"
},
"zone" : {
"type" : "keyword"
},
"metadata" : {
"type" : "object"
}
}
},
"os" : {
"properties" : {
"load" : {
"properties" : {
"1m" : {
"type" : "half_float"
},
"5m" : {
"type" : "half_float"
},
"15m" : {
"type" : "half_float"
}
}
},
"memory" : {
"properties" : {
"total_in_bytes" : {
"type" : "float"
},
"free_in_bytes" : {
"type" : "float"
},
"used_in_bytes" : {
"type" : "float"
}
}
},
"uptime_in_millis" : {
"type" : "long"
}
}
},
"process" : {
"properties" : {
"memory" : {
"properties" : {
"heap" : {
"properties" : {
"total_in_bytes" : {
"type" : "float"
},
"used_in_bytes" : {
"type" : "float"
},
"size_limit" : {
"type" : "float"
}
}
},
"resident_set_size_in_bytes" : {
"type" : "float"
}
}
},
"event_loop_delay" : {
"type" : "float"
},
"uptime_in_millis" : {
"type" : "long"
}
}
},
"sockets" : {
"properties" : {
"http" : {
"properties" : {
"total" : {
"type" : "long"
}
}
},
"https" : {
"properties" : {
"total" : {
"type" : "long"
}
}
}
}
},
"timestamp" : {
"type" : "date"
},
"requests" : {
"properties" : {
"disconnects" : {
"type" : "long"
},
"total" : {
"type" : "long"
},
"status_codes" : {
"type" : "object"
}
}
},
"response_times" : {
"properties" : {
"average" : {
"type" : "float"
},
"max" : {
"type" : "float"
}
}
},
"concurrent_connections" : {
"type" : "long"
}
}
}
}
}
},
"aliases" : { }
}
}