ElasticSearch 의 mapping 에 대해 알아보자. 이 글은 대부분 아래글의 내용의 번역이 될 것이다.
일단 기본적으로 SQL DB 에 대한 지식이 있다는 전제로 이야기를 해 나가겠다.
schema? mapping?
elasticsearch 의 schema 는 json 형태로 되어 있다. 이 json 에 field 의 data type 이나, 어떤 식으로 Lucene index 안에서 어떻게 index 될 것인지 를 적어놓게 된다. 이런 이유로 elasticsearch 에서는 이 schema 를 mapping 이라고 부른다.
index, type, document
index 는 여러개의 type 을 갖을 수 있고, 1개의 type 은 여러개의 document 를 가질 수 있다. 물론 1개의 값을 가질 수도 있다.
index > type > document
index 를 SQL DB 의 database, type 을 table, document 를 record 로 보면 될 것이다. 아래글에 따르면, 처음 eleasticsearch 가 index 를 rdbms 의 database 와 같다고 했지만 그것이 mapping type 의 field 에 대해서는 틀린 가정을 가져온다고 한다. 그리고 see also. 2 를 확인하면, type 이라는 존재가 사라졌다. 그래서 이제 index 는 table 로 개념을 가져가는 듯 하다.
default mapping
ElasticSearch 는 기본적으로 mapping 이 없이도 알아서 indexing 을 해준다. indexing 을 하는 동안에 새로운 field 를 만날 때 dynamically 하게 index 를 만들어 준다.
버전 7.0.0 이후로는 __default__ mapping 이 사라졌다고 한다.(deprecated)
default mapping 을 없애고 대신 document type 마다 index 를 만들던지, 새로운 type 을 만들어서 그 안에서 2개의 type 을 하나로 묶고, 그것을 구별할 custom type field 를 가져가던지 하라고 한다.(참고)
단점
단점은
- Detected type 이 정확하지 않을 수 있다.
- 원하지 않는 data 복사가 생길 수 있다.(특히, _source , _all field)
- indexing 과 searching 에 default analyzer 와 세팅을 사용한다.
mapping 을 사용하는 방법
index 생성시 사용
가장일반적인 방법이다
curl -XPOST ...:9200/my_index -d '{
"settings" : {
# .. index settings
},
"mappings" : {
"my_type" : {
# mapping for my_type
}
}
}'
Put Mapping API 사용
이녀석을 사용할 때는 mapping 되는 index 가 중복되는 경우에 mapping 이 update 되지 않을 수도 있고, ingnore_conflicts = true 로 한 경우라도, 이미 만들어진 index 가 새롭게 update 된 mapping 에 따라 update 되지 않을 수도 있다. 그래서 대부분의 경우는 index 생성시에 mapping 을 사용하는 방법을 이용하라고 한다.
$ curl -XPUT 'http://localhost:9200/my_index/my_type/_mapping' -d '
{
"my_type" : {
# mapping for my_type
}
}
index의 mapping 정보 확인
elasticsearch-sql-cli.bat
<elasticsearch_root>/bin/elasticsearch-sql-cli.bat
를 실행하면, sql 로 elasticsearch 를 retrieve 할 수 있게 해준다. 일단 안되는 명령어는 error 가 나온다.
show tables;
select * from ".elatichq"
mapping 정보와 elasticsearch-sql-cli의 결과 비교
elasticsearch-sql-cli.bat
를 사용하면 아래처럼 mapping 정보를 확인할 수 있다. mapping 은 간략하게 이야기하면 RDBMS 의 schema 와 같은 역할을 한다고 보면 될 듯 하다.
sql> select * from ".elastichq";
doc_id | doc_type |historic_days_to_store|historic_poll_interval| index_name |show_dot_indices| store_metrics | version |websocket_interval
---------------+---------------+----------------------+----------------------+---------------+----------------+---------------+---------------+------------------
hqsettings |data |7 |300 |.elastichq |true |true |1 |5
// curl localhost:9200/.elastichq?pretty=true
{
".elastichq" : {
"aliases" : { },
"mappings" : {
"properties" : {
"doc_id" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"doc_type" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"historic_days_to_store" : {
"type" : "long"
},
"historic_poll_interval" : {
"type" : "long"
},
"index_name" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"show_dot_indices" : {
"type" : "boolean"
},
"store_metrics" : {
"type" : "boolean"
},
"version" : {
"type" : "long"
},
"websocket_interval" : {
"type" : "long"
}
}
},
"settings" : {
"index" : {
"routing" : {
"allocation" : {
"include" : {
"_tier_preference" : "data_content"
}
}
},
"number_of_shards" : "1",
"provided_name" : ".elastichq",
"creation_date" : "1619967012964",
"number_of_replicas" : "1",
"uuid" : "gS2CCpcSSHGLmTRvqbetoQ",
"version" : {
"created" : "7120199"
}
}
}
}
}
댓글 없음:
댓글 쓰기