본문 바로가기
DataBase

[Elastic Search] search application (+search template / highlighting)

by HANdeveloper 2024. 1. 5.
Search Template

 

✅ Search Template 주요 이점

  1. 재사용성: 동일한 또는 유사한 쿼리를 여러 곳에서 사용해야 할 때, 검색 템플릿을 작성하여 중복 코드를 피할 수 있습니다.
  2. 동적 쿼리: 검색 템플릿은 변수를 사용하여 동적으로 쿼리를 생성할 수 있습니다. 이는 실행 시에 변수를 전달하여 쿼리를 다양하게 조정할 수 있음을 의미합니다.
  3. 검색 로직 분리: 복잡한 검색 로직을 템플릿으로 분리함으로써 코드를 더 깔끔하게 유지할 수 있습니다.

 

✅ template 저장 방법

   << request >>

  1.  _script 를 endpoint 로 주고 그 옆에 정하고자 하는 template 이름을 작성
  2. {{my_filed}} 나 {{my_value}} 는 변수값으로 실제 값으로 대체되어 검색하게 됨
PUT _script/{search_templete이름}
{
	"script" : {
    	"lang" : "mustache",
        "source" : {
        	"query" : {
            	"match" : {
                	"{{my_field}}" : "{{my_value}}"
 ...

 

✅ template 실행 방법

   << request >>

  1.  _search/template 를 endpoint 로 설정
  2. id에는 사용할 template 명을 적어줌
  3. {{my_filed}} 나 {{my_value}} 에 원하는 변수값을 정의함
GET blogs/_search/template
{
    "id" : "위에서 정한 template 명",
    "param" : {
    	"my_field" : "title",
        "my_value" : "shay banon"
    }
}

 

✅ lab 3.3 EXAM PREP 정리

Q. weekly_blogs 라는 search template 생성 후 start_date라는 param으로 일주일 기간을 검색하는 스크립트 작성하기

PUT _scripts/weekly_blogs
{
  "script" : {
    "lang": "mustache", 
    "source": {
      "query" : {
        "bool" : {
          "filter" : [
            {
            "range" : {
              "publish_date" : {
                "gte" : "{{start_date}}",
                "lt" : "{{start_date}}||+1w"
...

 

❌ [나의 틀린 부분]

 - "lang" 필드 빼먹음... (필수로 적어주자, 사용할 언어 정의해주는 것!)

 - filter 는 배열로 넣어주도록! (bool 쿼리는 인자 사용할 때 다른 쿼리들을 배열로 넣는 방식으로 동작됨)

 - gte/lt 사용하기

 - 1w 앞에 || 기호 넣어주기 (날짜 수학 표현식을 적용하는 역할을 함)

 

Q. 2021년 4월 1일 주의 상위 5개 블로그를 반환하는 쿼리를 작성하여 검색 템플릿이 작동하는지 확인하기

GET blogs_fixed2/_search/template
{
    "id" : "weekly_blogs",
    "params" : {
    	"start_date" : "2021-04-01"
	}
}

 

 ➡️ start_date에 원하는 날짜를 넣으면 기존에 설정해놓은 template 적용되어

     한 주 결과값을 가져오게됨!


highlighting

 

✅ 실행 방법

  1. match 하고자하는 쿼리를 "match" 안에 작성 ( e.g 제목이 security인 쿼리에 하이라이팅 처리할 때)
  2. highlight 부분에 적용하고자 하는 field 적어주고, pre_tags/post_tags 적어줌
GET blogs_fixed2/_search
{
  "query": {
    "match": {
      "title": "security"
    }
  },
  "highlight": {
    "fields": {
      "title": {}
    },
    "pre_tags": [
      "<strong>"
    ],
    "post_tags": [
      "</strong>"
    ]
  }
}

 

❌ [나의 틀린 부분]

 - pre_tags 와 post_tags 는 배열안에 담도록!

 

댓글