본문 바로가기
ELK Stack

[Elasticsearch] Index Template (인덱스템플릿)

by 잭피 2021. 11. 2.

 

안녕하세요~ 잭코딩입니다!

오늘은 실무에서 잘 활용하고 있는 Elasticsearch - Index Template 기능을 포스팅해보려고 합니다


https://www.elastic.co/guide/en/elasticsearch/reference/current/index-templates.html

 

Index templates | Elasticsearch Guide [7.15] | Elastic

This topic describes the composable index templates introduced in Elasticsearch 7.8. For information about how index templates worked previously, see the legacy template documentation. An index template is a way to tell Elasticsearch how to configure an in

www.elastic.co

 

인덱스 템플릿은 주로 설정이 동일한 복수의 인덱스를 만들 때 사용합니다 

 

예를 들어,

자동완성 데이터를 ES에 색인하려고 합니다

항공쪽 자동완성 데이터를 autocomplete-airline 인덱스로 색인하고,

호텔쪽 자동완성 데이터를 autocomplete-hotel 인덱스로 색인해야합니다

 

둘다 같은 사전을 사용하고, 같은 토큰필터, 토크나이저, analyzer를 사용합니다

또한 색인하는 필드도 keyword로 동일하고 가중치 필드도 boost로 동일합니다

 

이런 경우 각각의 settings, mappings를 관리하기 보다는 indexTemplate을 사용하여 보다 효율적으로 관리할 수 있습니다

패턴을 정의하여 해당 패턴의 이름으로 인덱스가 생성되는 경우 같은 setting, mapping, 사전을 사용할 수 있습니다

 

위의 경우 autocomplete-*로 패턴을 사용할 수 있겠죠?

 

1. 생성

한번 생성해볼까요?

PUT _template/autocomplete
{
  "index_patterns": [
    "autocomplete-*"
  ],
  "settings": {
    "index" : {
      "analysis" : {
        "tokenizer": {
          "ngram_tokenizer" : {
            "token_chars" : [
              "letter",
              "digit",
              "punctuation",
              "symbol"
            ],
            "min_gram" : "2",
            "type" : "ngram",
            "max_gram" : "3"
          },
          "korean_nori_tokenizer" : {
            "type" : "nori_tokenizer",
            "decompound_mode" : "discard",
            "user_dictionary_rules" : [
              // 사전 데이터들 ...
            ]
          }
        },
        "filter" : {
          "edge_ngram_filter_front" : {
            "type" : "edge_ngram",
            "min_gram" : "1",
            "max_gram" : "20"
          },
          "edge_ngram_filter_back" : {
            "type" : "edge_ngram",
            "min_gram" : "1",
            "max_gram" : "20",
            "side" : "back"
          },
          "whitespace_remove_filter" : {
            "type" : "pattern_replace",
            "pattern" : " ",
            "replacement" : ""
          },
          "synonym_filter" : {
            "type" : "synonym_graph",
            "synonyms" : [
              // 동의어 데이터들 ... 
            ],
            "updateable" : false
          },
          "nori_posfilter" : {
            "type" : "nori_part_of_speech",
            "stoptags" : [
              "E", "IC", "J", "MAJ", "NA", "SC", "SE",
              "SF", "SY", "XSA", "XSN", "XSV", "VCP"
            ]
          }
        },
        "analyzer" : {
          "jamo_ngram_front_analyzer" : {
            "type" : "custom",
            "tokenizer" : "keyword",
            "filter" : [
              "trim",
              "whitespace_remove_filter",
              "lowercase",
              "jamo_filter",
              "edge_ngram_filter_front"
            ]
          },
          "ngram_analyzer" : {
            "type" : "custom",
            "tokenizer" : "ngram_tokenizer",
            "filter" : [
              "trim",
              "lowercase",
              "whitespace_remove_filter"
            ]
          },
          "chosung_ngram_analyzer" : {
            "type" : "custom",
            "tokenizer" : "keyword",
            "filter" : [
              "trim",
              "whitespace_remove_filter",
              "chosung_fliter",
              "edge_ngram_filter_front"
            ]
          },
          "language_convert_ngram_analyzer" : {
            "type" : "custom",
            "tokenizer" : "keyword",
            "filter" : [
              "trim",
              "lowercase",
              "whitespace_remove_filter",
              "language_filter",
              "edge_ngram_filter_front"
            ]
          },
          "jamo_analyzer" : {
            "type" : "custom",
            "tokenizer" : "keyword",
            "filter" : [
              "trim",
              "lowercase",
              "whitespace_remove_filter",
              "jamo_filter"
            ]
          },
          "whitespace_remove_analyzer" : {
            "type" : "custom",
            "tokenizer" : "keyword",
            "filter" : [
              "lowercase",
              "trim",
              "whitespace_remove_filter"
            ]
          },
          "nori_analyzer" : {
            "type" : "custom",
            "tokenizer" : "korean_nori_tokenizer",
            "filter" : [
              "nori_readingform",
              "synonym_filter",
              "nori_posfilter",
              "lowercase"
            ]
          }
        }
      },
      "number_of_shards" : 1,
      "number_of_replicas" : 3
    }
  },
  "mappings": {
    "properties": {
      "keyword" : {
        "type" : "text",
        "fields" : {
          "keyword_jamo" : {
            "analyzer" : "jamo_ngram_front_analyzer",
            "search_analyzer" : "jamo_analyzer",
            "type" : "text"
          },
          "keyword_ngram" : {
            "analyzer" : "ngram_analyzer",
            "search_analyzer" : "whitespace_remove_analyzer",
            "type" : "text"
          },
          "keyword_chosung" : {
            "analyzer" : "chosung_ngram_analyzer",
            "search_analyzer" : "whitespace_remove_analyzer",
            "type" : "text"
          },
          "keyword_typo" : {
            "analyzer" : "language_convert_ngram_analyzer",
            "search_analyzer" : "whitespace_remove_analyzer",
            "type" : "text"           
          },
          "keyword_synonym" : {
            "analyzer" : "nori_analyzer",
            "type" : "text"            
          }
        }
      },
      "boost" : {
          "type" : "long"
        }
    }
  }
}

 

2. 적용

적용은 간단합니다

인덱스를 생성할 때, 위와 동일한 필드에 데이터를 넣고 autocomplete-* 패턴의 이름으로 인덱스를 생성해주면 자동으로 위의 설정을 가지고 생성됩니다

 

 

이번 포스팅에서는 색인할 때 사용하는 템플릿인 indexTempalte을 알아봤습니다
다음 포스팅에서는 검색할 때 사용하는 템플릿인 searchTemplate을 알아보겠습니다
직접 서버에서 spring-data-elasticsearch 또는 restHighLevelClient를 통해 쿼리를 날려서 데이터를 가져올 수 있지만,
미리 쿼리를 script를 통해 만들어둔 후, searchTemplate만을 호출해서 데이터를 가져올 수 있습니다

 

- Search Template -

https://jackjeong.tistory.com/161

 

[Elasticsearch] SearchTemplate (서치 템플릿)

안녕하세요~ 잭코딩입니다! 오늘은 실무에서 잘 활용하고 있는 Elasticsearch - Search Template 기능을 포스팅해보려고 합니다 https://www.elastic.co/guide/en/elasticsearch/reference/current/search-templa..

jackjeong.tistory.com

 

 

 

 

 

댓글