Elasticsearch Template

아시다시피 엘라스틱서치는 미리 스키마를 정의할 필요없이 데이타를 입력함과 동시에 알아서 스키마를 자동으로 정의해줍니다. 하지만 자동으로 만들어진 스키마는 데이타에 따라서 달라질수 있고, 이 경우 검색결과의 consistency를 보장해주지 않습니다. 그래서 우리가 데이타를 입력하기 전에 인덱스의 mapping을 미리 정의해 주는데요, 만약에 만들어야하는 인덱스가 여러개라면 예를 들어 버젼별로 있거나 한다면, 인덱스를 사용하기 전에 매번 매핑을 만들어주는 번거로움이 있습니다. 그래서 이럴때 사용하라고 Template이라는게 있는데요. Template은 인덱스의 스키마를 미리 정의해놓고 나중에 데이타가 들어오면 자동으로 Template에 정의된 스키마를 가지고 인덱스를 생성한 후에 데이타를 입력하라고 정의해놓는거에요. 아래의 예를 보시면:

curl --location --request PUT 'http://localhost:9200/_template/blog' \
--header 'content-type: application/json; charset=UTF-8' \
--data-raw '{
  "template" : "blog*",
    "mappings": {
        "media": {
            "properties": {
                "id": {
                    "type": "keyword"
                },
                "title": {
                    "type": "text"
                },
                "description": {
                    "type": "text"
                }
            },
            "dynamic": "strict"
        }
    }
}'

위의 명령어는 blog라는 이름의 template을 만드는데 이 template은 인덱스 이름이 blog로 시작하는 존재하지 않는 인덱스에 데이타를 넣으려고 시도할때, 해당 template의 조건에 맞기때문에 스키마를 임의로 만들지 않고 template에 정의된 인덱스를 만든 후에 데이타를 입력합니다. 아래는 만들어진 template을 확인하는 명령어 입니다.

curl --location --request GET 'http://localhost:9200/_template/blog'

References:

  • https://oboki.net/workspace/bigdata/elasticsearch/elasticsearch-index-template/
  • https://www.elastic.co/guide/en/elasticsearch/guide/2.x/index-templates.html#index-templates
  • https://elasticsearch-dsl.readthedocs.io/en/latest/persistence.html