ElasticSearch 활용 - Index API

2020, Oct 05    

기본 개념

클러스터

  • 클러스터는 하나 이상의 노드(서버)가 모인 것

노드

  • 노드는 클러스터에 포함된 단일 서버로서 데이터를 저장하고 클러스터의 색인화 및 검색 기능에 참여 (이름으로 식별)

인덱스

  • 색인은 다소 비슷한 특성을 가진 문서의 모음

타입

  • 하나의 색인에서 하나 이상의 유형을 정의할 수 있음

도큐먼트

  • 문서는 색인화할 수 있는 기본 정보 단위

샤드

  • 색인은 방대한 양의 데이터를 저장할 수 있는데, 이 데이터가 단일 노드의 하드웨어 한도를 초과할 수도 있으므로 이러한 문제를 해결하고자 색인을 이른바 샤드(shard)라는 조각으로 분할하는 기능을 제공

레플리카

  • 복제본
  • 샤드/노드 오류가 발생하더라도 고가용성을 제공
  • 모든 리플리카에서 병렬 방식으로 검색을 실행할 수 있으므로 검색 볼륨/처리량을 확장할 수 있음

인덱스 관리(Index Management)

인덱스 생성(Create Index)

PUT /my-index-000001
{
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "index" : "my-index-000001"
}

인덱스 세팅(Index Settings)

  • 샤드와 레플리카 갯수 세팅
  • 샤드 설정은 생성할 때 한번 지정하면 변경 불가
  • 레플리카는 다이나믹하게 변경 가능
PUT /my-index-000001
{
  "settings": {
    "index": {
      "number_of_shards": 3,  
      "number_of_replicas": 2 
    }
  }
}

## 간단한 명령어
PUT /my-index-000001
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 2
  }
}

인덱스 맵핑(Mappings)

  • 데이터의 매핑이 자동으로 생성되기 전에 매핑을 정의해놓으면 매핑에 맞추어서 데이터 입력 가능
PUT /test
{
  "settings": {
    "number_of_shards": 1
  },
  "mappings": {
    "properties": {
      "field1": { "type": "text" }
    }
  }
}

인덱스 별명 (Aliases)

  • index에 별명을 붙여주는 것
PUT /test
{
  "aliases": {
    "alias_1": {},
    "alias_2": {
      "filter": {
        "term": { "user.id": "kimchy" }
      },
      "routing": "shard-1"
    }
  }
}

GET /test
{
  "test" : {
    "aliases" : {
      "alias_1" : { },
      "alias_2" : {
        "filter" : {
          "term" : {
            "user.id" : "kimchy"
          }
        },
        "index_routing" : "shard-1",
        "search_routing" : "shard-1"
      }
    },
    "mappings" : { },
    "settings" : {
      "index" : {
        "creation_date" : "1601873312529",
        "number_of_shards" : "1",
        "number_of_replicas" : "1",
        "uuid" : "0SoRYG7ySPuin83QjgDbYQ",
        "version" : {
          "created" : "7090299"
        },
        "provided_name" : "test"
      }
    }
  }
}

인덱스 삭제(Delete Index)

DELETE /test

인덱스 별명 삭제(Delete Index alias)

DELETE /test/_alias/alias_2
GET /test
{
  "test" : {
    "aliases" : {
      "alias_1" : { }
    },
    "mappings" : { },
    "settings" : {
      "index" : {
        "creation_date" : "1601873897961",
        "number_of_shards" : "1",
        "number_of_replicas" : "1",
        "uuid" : "BIbcBFRVSBKDyly1SiIwjA",
        "version" : {
          "created" : "7090299"
        },
        "provided_name" : "test"
      }
    }
  }
}

인덱스 조회(Get Index)

GET /test
{
  "test" : {
    "aliases" : {
      "alias_1" : { }
    },
    "mappings" : { },
    "settings" : {
      "index" : {
        "creation_date" : "1601873897961",
        "number_of_shards" : "1",
        "number_of_replicas" : "1",
        "uuid" : "BIbcBFRVSBKDyly1SiIwjA",
        "version" : {
          "created" : "7090299"
        },
        "provided_name" : "test"
      }
    }
  }
}

인덱스 존재 유무 확인(Index exists)

  • 200의 경우 존재, 404의 경우 존재하지 않음을 의미
HEAD /test
200 - OK

인덱스 닫기(Close Index)

  • 읽기와 쓰기 블록 처리
POST /test/_close

POST /test/_doc/1
{
  "name" : "hamletshu"
}
{
  "error" : {
    "root_cause" : [
      {
        "type" : "index_closed_exception",
        "reason" : "closed",
        "index_uuid" : "BIbcBFRVSBKDyly1SiIwjA",
        "index" : "test"
      }
    ],
    "type" : "index_closed_exception",
    "reason" : "closed",
    "index_uuid" : "BIbcBFRVSBKDyly1SiIwjA",
    "index" : "test"
  },
  "status" : 400
}

인덱스 열기(Open Index)

  • 닫힌 인덱스 열기
POST /test/_open

POST /test/_doc/1
{
  "name" : "hamletshu"
}
{
  "_index" : "test",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "result" : "craeted",
  "_shards" : {
    "total" : 2,
    "successful" : 2,
    "failed" : 0
  },
  "_seq_no" : 6,
  "_primary_term" : 3
}

인덱스 복제(Clone Index)

  • index.blocks.write 설정이 true로 되어있어야 복제 가능
PUT /test/_settings
{
  "settings":{
    "index.blocks.write":true
  }
}

POST /test/_clone/test2

인덱스 동결(Freeze Index)

  • 동결할 경우 읽기만 가능
POST /test/_freeze

POST /test/_doc/2
{
  "name" : "hamletshu"
}
{
  "error" : {
    "root_cause" : [
      {
        "type" : "cluster_block_exception",
        "reason" : "index [test] blocked by: [FORBIDDEN/8/index write (api)];"
      }
    ],
    "type" : "cluster_block_exception",
    "reason" : "index [test] blocked by: [FORBIDDEN/8/index write (api)];"
  },
  "status" : 403
}

인덱스 동결 해제(Unfreeze Index)

{
  "_index" : "test",
  "_type" : "_doc",
  "_id" : "2",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 2,
    "failed" : 0
  },
  "_seq_no" : 7,
  "_primary_term" : 7
}
POST /test/_unfreeze

POST /test/_doc/2
{
  "name" : "hamletshu"
}

여러 인덱스 조회(Resolve Index)

GET /_resolve/index/test*
{
  "indices" : [
    {
      "name" : "test",
      "aliases" : [
        "alias_1"
      ],
      "attributes" : [
        "open"
      ]
    },
    {
      "name" : "test2",
      "attributes" : [
        "open"
      ]
    }
  ],
  "aliases" : [ ],
  "data_streams" : [ ]
}

맵핑 관리(Mapping Management)

Put mapping

  • 맵핑 정의
PUT /test/_mapping
{
  "properties": {
    "email": {
      "type": "keyword"
    }
  }
}

Get mapping

  • 맵핑 정보 조회
GET /test/_mapping

## 아래의 명령어로 전체 조회도 가능
GET /*/_mapping

GET /_all/_mapping

GET /_mapping
{
  "test" : {
    "mappings" : {
      "properties" : {
        "email" : {
          "type" : "keyword"
        },
        "name" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    }
  }
}

Get field mapping

  • 해당 필드에 해당하는 매핑정보 확인
GET /test/_mapping/field/email
{
  "test" : {
    "mappings" : {
      "email" : {
        "full_name" : "email",
        "mapping" : {
          "email" : {
            "type" : "keyword"
          }
        }
      }
    }
  }
}

별명 관리(Alias Management)

Add Index Alias

PUT /<index>/_alias/<alias>

POST /<index>/_alias/<alias>

PUT /<index>/_aliases/<alias>

POST /<index>/_aliases/<alias>

PUT /test/_alias/alias1

GET /test/_alias
GET /test/_alias/alias1
{
  "test" : {
    "aliases" : {
      "alias1" : { },
      "alias2" : { },
      "alias_1" : { }
    }
  }
}

{
  "test" : {
    "aliases" : {
      "alias1" : { }
    }
  }
}

Delete Index Alias

DELETE /test/_alias/alias1

GET /test/_alias
{
  "test" : {
    "aliases" : {
      "alias2" : { },
      "alias_1" : { }
    }
  }
}

Get Index Alias

GET /_alias

GET /_alias/<alias>

GET /<index>/_alias/<alias>

GET /test/_alias

GET /test/_alias/alias2
{
  "test" : {
    "aliases" : {
      "alias2" : { },
      "alias_1" : { }
    }
  }
}

{
  "test" : {
    "aliases" : {
      "alias2" : { }
    }
  }
}

Index Alias Exists

  • Alias 존재 여부 확인

HEAD /_alias/<alias>

HEAD /<index>/_alias/<alias>

HEAD /test/_alias

HEAD /test/_alias/alias2
200 - OK

200 - OK

Update Index Alias

POST /_aliases
{
  "actions" : [
    { "add" : { "index" : "test", "alias" : "alias1" } }
  ]
}

GET /test/_alias/alias1
{
  "test" : {
    "aliases" : {
      "alias1" : { }
    }
  }
}

Index Templates

  • 새로운 인덱스를 생성할 때 자동으로 Settings, Mappings, Aliases을 하게해주는 기능을 가짐

Put index template

  • 인덱스 템플릿 생성
PUT /_index_template/template_1?pretty
{
  "index_patterns" : ["te*"],
  "priority" : 1,
  "template": {
    "settings" : {
      "number_of_shards" : 2
    }
  }
}

Get index template

  • 인덱스 템플릿 조회
GET /_index_template/template_1
{
  "index_templates" : [
    {
      "name" : "template_1",
      "index_template" : {
        "index_patterns" : [
          "te*"
        ],
        "template" : {
          "settings" : {
            "index" : {
              "number_of_shards" : "2"
            }
          }
        },
        "composed_of" : [ ],
        "priority" : 1
      }
    }
  ]
}

Delete index template

  • 인덱스 템플릿 삭제
DELETE /_index_template/template_1

GET /_index_template/template_1
{
  "error" : {
    "root_cause" : [
      {
        "type" : "resource_not_found_exception",
        "reason" : "index template matching [template_1] not found"
      }
    ],
    "type" : "resource_not_found_exception",
    "reason" : "index template matching [template_1] not found"
  },
  "status" : 404
}

Put component template

  • 컴포넌트 템플릿 생성
PUT /_component_template/template_1?pretty
{
  "template": {
    "settings": {
      "number_of_shards": 1
    },
    "mappings": {
      "_source": {
        "enabled": false
      },
      "properties": {
        "host_name": {
          "type": "keyword"
        },
        "created_at": {
          "type": "date",
          "format": "EEE MMM dd HH:mm:ss Z yyyy"
        }
      }
    }
  }
}

Delete component template

  • 컴포넌트 템플릿 삭제
DELETE /_component_template/template_1

Index template exists

  • 인덱스 템플릿 존재여부 확인
HEAD /_template/template_1