ELK Stack

[Elasticsearch] Search Template (서치템플릿)

잭피 2021. 11. 5. 16:23

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

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


 

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-template.html

 

Search templates | Elasticsearch Guide [7.15] | Elastic

A search template is a stored search you can run with different variables. If you use Elasticsearch as a search backend, you can pass user input from a search bar as parameters for a search template. This lets you run searches without exposing Elasticsearc

www.elastic.co

SearchTemplate을 사용하면 Query를 미리 작성하여 템플릿으로 만들어서 사용할 수 있습니다

 

API 서버 단에서 쿼리를 작성하여 날리는 방법도 있지만,

이렇게 템플릿으로 미리 만들어둔 후 Template ID를 통해서 간단히 호출할 수 있습니다

 

한번 간단하게 작성해볼까요?

PUT _scripts/jack-search-template
{
  "script": {
    "lang": "mustache",
    "source": {
      "query": {
        "match": {
          "message": "{{query_string}}"
        }
      },
      "from": "{{from}}",
      "size": "{{size}}"
    }
  }
}

이렇게 jack-search-template이라는 ID를 가진 Search Template을 하나 만듭니다

 

한번 호출해볼까요?

GET jack_index/_search/template
{
  "id": "jack-search-template",
  "params": {
    "query_string": "Hello Jack Coding",
    "from": 20,
    "size": 10
  }
}

jack_index라는 인덱스 이름(또는 Alias)에 "jack-search-template"으로 호출합니다

그리고 필요한 파라미터를 넘겨줍니다

 

실제 서버에서 호출할 때도  Search Temaplate ID, 조회할 인덱스 or Alias 이름,

그리고 파라미터 값만 넘겨주면 됩니다

자주 사용되는 쿼리의 경우 이렇게 템플릿으로 만들어두면 편하게 사용할 수 있습니다

 

그리고 또 하나의 장점이 있습니다

부스팅을 조절하거나 쿼리에서 간단한 수정이 있을 때, 간편하게 수정할 수 있습니다

 

만약 서버에서 수정하는 경우
배포가 힘든 환경에서 잦은 배포가 부담스러울 수 있습니다
쿼리 하나 수정한 후 Dev -> QA -> Stage -> Production 까지 올려야 합니다

 

한번 예를 들어보겠습니다

 

아래는 Analyzer로 태우지 않은 keyword와 nori-ananylzer를 태운 Keyword를 조회하는 쿼리입니다

query 파라미터로 자동차 보험이라는 검색어가 들어오면,

nori는 [자동차, 보험]으로 토큰을 분리하여 검색하고, origin의 경우는 [자동차 보험] 그대로 검색합니다

POST _scripts/jack_search_template2
{
  "script" : {
    "lang" : "mustache",
    "source": {
      "query": {
        "function_score": {
          "query": {
            "multi_match": {
              "query": "{{query}}",
              "fields": [
                  "keyword.nori",
                  "keyword.origin"
                ]
            }
          },
          "functions": [
            {
              "filter": {
                "match" : {
                  "keyword.origin" : {
                    "query" : "{{query}}"
                  }
                }
              }
            },
            {
              "filter": {
                "match" : {
                  "keyword.nori" : {
                    "query" : "{{query}}"
                  }
                }
              }
            }
          ],
          "score_mode": "sum",
          "boost_mode": "sum"
        }
      }
    }
  }
}

여기서 토큰을 분리하지 않은 keyword.origin에 부스팅을 하는 경우가 생겼다면,

아래처럼 weight만 추가한 후, 템플릿을 새로 생성해주면 됩니다

POST _scripts/jack_search_template2
{
  "script" : {
    "lang" : "mustache",
    "source": {
      "query": {
        "function_score": {
          "query": {
            "multi_match": {
              "query": "{{q}}",
              "fields": [
                  "keyword.nori",
                  "keyword.origin"
                ]
            }
          },
          "functions": [
            {
              "filter": {
                "match" : {
                  "keyword.origin" : {
                    "query" : "{{q}}"
                  }
                }
              },
              "weight": 10
            },
            {
              "filter": {
                "match" : {
                  "keyword.nori" : {
                    "query" : "{{q}}"
                  }
                }
              },
              "weight": 1
            }
          ],
          "score_mode": "sum",
          "boost_mode": "sum"
        }
      }
    }
  }
}

 

이렇게 쿼리를 템플릿으로 만드는 방법을 살펴보았습니다

 

 

- 인덱스 템플릿 - 

https://jackjeong.tistory.com/159

 

[Elasticsearch] IndexTemplate (인덱스템플릿)

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

jackjeong.tistory.com