엔지니어 블로그

[Elasticsearch] Mustache 본문

ELK/elasticsearch

[Elasticsearch] Mustache

안기용 2023. 4. 4. 16:47

Mustache

  • Mustache는 다양한 언어를 합쳐서 사용할 수 있는 템플릿 엔진이다.
  • Elasticsearch의 script에서 유용하게 사용된다.

1. {{#}} ,{{^}} 용법

  • mustache를 사용하여 script를 작성할때 빈번하게 사용되는 용법이다.

1. {{# keyword}}~{{/keyword}}

  • #은 변수로 받은 값이 True일때 실행된다.
    • 해당 파라미터에 값이 들어왔을떄만 검색을 실행하게 된다.
  • Elasticsearch에서는 주로 일부 파라미터 값이 빈값일때, 다른 값들은 정상적으로 검색되도록 할 때 사용한다.
GET my_index/_search/template
{
  "id": "test_template",
  "params": {
    "from": "",
    "size": "",
    "query1": "",
    "query2": "keyword"
  }
}

POST _scripts/test_template
{
  "script": {
  "lang": "mustache",
  "source": """{
    "from": "{{from}}{{^from}}0{{/from}}",
    "size": "{{size}}{{^size}}20{{/size}}",
       "query" : {
         "bool" : {
           "must" : [
            {{#query1}}
               {
                 "match" : {
                   "field1" : {
                      "query" : "{{query1}}"
                   }
                 }
               }{{/query1}}{{#query2}},
               {
                 "match" : {
                   "field2" : {
                      "query" : "{{query2}}"
                   }
                 }
               }{{/query2}}
           ]
         }       
       }       
    }
  """
  }
}

2. {{^keyword}}~{{/keyword}}

  • ^은 값이 Flase일 때 실행된다.
    • 해당 파라미터에 값이 들어오지 않으면 실행된다.
  • Elasticsearch에서는 일부 파라미터의 default 값을 지정할 때 사용한다.
  • 아래 script는 "query1" 파라미터의 값이 빈값이면, default 값인 keyword가 검색된다.
GET my_index/_search/template
{
  "id": "test_template",
  "params": {
    "from": "",
    "size": "",
    "query1": ""
  }
}

POST _scripts/test_template
{
  "script": {
  "lang": "mustache",
  "source": """{
    "from": "{{from}}{{^from}}0{{/from}}",
    "size": "{{size}}{{^size}}20{{/size}}",
       "query" : {
         "bool" : {
           "must" : [
            {{#query1}}
               {
                 "match" : {
                   "field1" : {
                      "query" : "{{query1}}"
                   }
                 }
               }{{/query1}}{{^query1}},
               {
                 "match" : {
                   "field1" : {
                      "query" : "keyword"
                   }
                 }
               }{{/query1}}
           ]
         }       
       }       
    }
  """
  }
}