Elasticsearch Settings & Mappings
모든 인덱스는 두 개의 정보 단위를 가지고 있는데 바로 settings(설정) 와 mappings(매핑) 이다.
인덱스를 처음 생성 한뒤 조회하면 설정과 매핑 정보를 확인할 수 있다.
설정 - Settings
GET user_info/_setings
GET user_info/_mappings
세팅이나 매핑 정보만 따로 보고 싶으면 위의 명령어로 보면 된다.
처음 인덱스를 정의하면 몇가지 정보들이 자동으로 생성되는데 샤드 수는 7.0버전부터 디폴트로 1개가 설정된다.
number_of_shards, number_of_replicas
샤드 수와 리플리카는 number_of_shards , number_of_replicas 에서 설정한다.
세팅 아래의 index 아래 설정에 명시되는데 index 레벨은 생략하고 입력 해도 정상적으로 입력 된다.
PUT user_info1
{
"settings": {
"index" : {
"number_of_shards" : 3,
"number_of_replicas" : 1
}
}
}
PUT user_info1
{
"settings": {
"index.number_of_shards" : 3,
"index.number_of_replicas" : 1
}
}
PUT user_info1
{
"settings": {
"number_of_shards" : 3,
"number_of_replicas" : 1
}
}
number_of_shards : 인덱스를 처음 생성할 때 한번 지정하면 바꿀 수 없다.
샤드 수를 바꾸려면 인덱스를 새로 정의하고 기존 인덱스의 데이터를 재색인 해야한다.
number_of_replicas 설정은 동적으로 변경 가능하다.
PUT user_info1/_settings
{
"number_of_replicas" : 3
}
refresh_interval
자주 사용되는 설정이다.
ES에서 세그먼트가 만들어지는 리프레시 타임을 설정하는 값인데 기본이 1초이다.
refresh_interval은 설정 변경이 가능하며 settings 의 index 아래에 설정한다.
PUT user_info1/_settings
{
"refresh_interval": "30s"
}
analyzer , tokenizer , filter
애널라이저, 토크나이저, 토큰 필터 역시 setting 내부에 정의한다.
PUT my_index
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"type": "custom",
"char_flter": [ "...", "..." ... ]
"tokenizer": "...",
"filter": [ "...", "..." ... ]
}
},
"char_filter":{
"my_char_filter":{
"type": "…"
...
}
}
"tokenizer": {
"my_tokenizer":{
"type": "…"
...
}
},
"filter": {
"my_token_filter": {
"type": "…"
...
}
}
}
}
}
analysis 내부에 analyzer, char_filter, tokenizer, filter 를 입력하고 각자 내부에서 임의의 이름을 주어 각 기능들을 정의한다. 각 내부에 하나 이상 생성할수 있고 애널라이저에서는 사용자가 정의한 토크나이저, 토큰 필터를 사용하거나 ES 안에 미리 정의된 것을 사용 할 수 있다.
analysis 내용은 한번 생성한 후 변경은 불가능하다. 이미 만들어진 애널라이저나 토크나이저 등을 추가하거나 변경하려면 인덱스를 먼저 close 한 후에 추가하고 다시 open 해서 적용 해야 한다.
매핑 - Mappings
동적 매핑
Elasticsearch 는 동적 매핑을 지원하기 때문에 미리 정의하지 않아도 인덱스에 도큐먼트를 새로 추가하면 자동으로 매핑이 생성된다.
인덱스가 없는 상태에서 도큐먼트를 넣어본다.
PUT user_info2/_doc/1
{
"name" : "user1",
"age" : "22",
"tel" : "010-1234-5678",
"reg_date" : "2024-04-01T00:00:00"
}
user_info2 의 인덱스 매핑을 확인해보면 각 필드의 매핑이 자동으로 생성된 것을 확인할 수 있다.
인덱스의 매핑에서 필드들은 mappings 아래 properties 항목의 아래에 지정된다.
name , age , tel 은 text와 keyword 타입으로, reg_date는 date 타입으로 자동 지정 된 것을 확인할 수 있다.
ES의 매핑이 동적으로 생성될 때는 필드의 값을 보고 타입을 예상하는데, 항상 그 필드가 포함 될 수 있는 가장 넓은 범위 형태의 데이터 타입을 선택한다. reg_date 필드 값은 "2024-04-01T00:00:00" 로 ISO8601 표준 날짜 형식 데이터를 준수하였기 때문에 date 타입으로 인식 되었다. 날짜가 "4 April 2024 00:00:00" 과 같이 다른 포맷으로 입력이 되면 보통은 text 타입으로 인식된다.
매핑 정의
미리 인덱스의 매핑을 정의 해 놓으면 매핑에 맞추어 데이터가 입력된다.
PUT <인덱스명>
{
"mappings": {
"properties": {
"<필드명>":{
"type": "<필드 타입>"
… <필드 설정>
}
…
}
}
}
이미 만들어진 매핑에 필드를 추가하는 것은 가능하다.
하지만 이미 만들어진 필드를 삭제하거나 필드의 타입 및 설정값을 변경하는 것은 불가능하다.
필드의 변경이 필요한 경우 인덱스를 새로 정의하고 기존 인덱스의 값을 새 인덱스에 모두 재색인 해야한다.
이미 생성된 인덱스에 새로운 필드를 추가하는 방법
PUT <인덱스명>/_mapping
{
"properties": {
"<추가할 필드명>": {
"type": "<필드 타입>"
… <필드 설정>
}
}
}
reference
https://esbook.kimjmin.net/07-settings-and-mappings/7.2-mappings