기술나눔

Elasticsearch 검색 템플릿: 쿼리 재사용 및 공유

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Elasticsearch(ES)의 일상적인 개발 및 운영에서 우리는 유사한 쿼리를 자주 실행해야 하는 시나리오를 자주 접하게 됩니다. 이러한 쿼리에는 비즈니스 논리의 복잡성으로 인해 여러 필드, 필터 조건 및 집계 분석이 포함될 수 있습니다. 이러한 작업을 최적화하고 개발 효율성을 향상시키기 위해 Elasticsearch는 검색 템플릿 기능을 제공합니다. 이 문서에서는 Elasticsearch의 검색 템플릿을 사용하여 쿼리를 재사용하고 공유하는 방법을 설명합니다.

1. 검색 템플릿을 사용하는 이유

일상적인 개발에서는 대부분의 쿼리가 상대적으로 간단할 수 있지만 일부 복잡한 비즈니스 시나리오(예: 금융, 의학 등)에서는 검색 시 수십 개의 필드를 전달하거나 반환해야 하며 복잡한 필터링 조건 및 집계 분석이 필요할 수 있습니다. . 이 시점에서 각 쿼리를 수동으로 작성하는 것은 비효율적일 뿐만 아니라 오류가 발생하기 쉽습니다. 검색 템플릿은 MySQL의 저장 프로시저 또는 함수와 유사하며 한 번만 정의하면 되며 나중에 템플릿을 호출하고 매개변수를 전달하여 검색 기능을 완료할 수 있으므로 개발 효율성과 쿼리 유연성이 크게 향상됩니다.

2. 검색 템플릿 도입 사례

2.1 표준양식

검색 템플릿의 기본 형태는 쿼리 조건을 포함하는 JSON 개체를 정의하고 전달하는 것입니다._search/template API 호출. 예를 들어:

GET /index_name/_search/template
{
  "source": {
    "query": {
      "match": {
        "remark": "{{kw}}"
      }
    },
    "size": "{{size}}"
  },
  "params": {
    "kw": "真正的数值",
    "size": 100
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

이 예에서는{{kw}}그리고{{size}}템플릿의 변수이며 전달되었습니다.params객체는 특정 값을 전달합니다.

2.2 toJSON 형식

toJSON형태가 특징이다source 문자열을 사용하여 정의하고 이스케이프 문자가 필요합니다. 예를 들어:

GET cars/_search/template
{
  "source": "{ "query": { "match": {{#toJson}}parameter{{/toJson}} }}",
  "params": {
    "parameter": {
      "remark": "真正的数值"
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

2.3 조인 메소드에서 매개변수 전달하기

사용join 이 메서드는 배열의 요소를 쿼리 조건에 대한 문자열로 연결할 수 있습니다. 예를 들어:

GET index_name/_search/template
{
  "source": {
    "query": {
      "match": {
        "remark": "{{#join delimiter=' '}}kw{{/join delimiter=' '}}"
      }
    }
  },
  "params": {
    "kw": ["大众", "标致", "奔驰", "宝马"]
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

2.4 기본값 형식

템플릿에서 매개변수에 대한 기본값을 설정할 수 있습니다. 호출 시 매개변수가 전달되지 않으면 기본값이 사용됩니다. 예를 들어:

GET index_name/_search/template
{
  "source": {
    "query": {
      "range": {
        "price": {
          "gte": "{{start}}",
          "lte": "{{end}}{{^end}}200000{{/end}}"
        }
      }
    }
  },
  "params": {
    "start": 100000
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

3. 템플릿을 기억하고 반복 호출을 구현하세요.

3.1 Elasticsearch 저장 템플릿

템플릿을 재사용하기 위해 Elasticsearch에 저장할 수 있습니다. 템플릿 이름을 지정해 주면 나중에 반복적으로 호출할 때 편리합니다. 예를 들어:

POST _scripts/my_test_template
{
  "script": {
    "lang": "mustache",
    "source": {
      "query": {
        "match": {
          "field_name": "{{kw}}"
        }
      }
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

3.2 통화 템플릿

템플릿을 호출할 때 다음을 전달합니다.id 특정 템플릿을 지정하고 해당 매개변수를 전달합니다. 예를 들어:

GET index_name/_search/template
{
  "id": "my_test_template",
  "params": {
    "kw": "自定义template的参数值"
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

3.3 정의된 템플릿 쿼리

정의된 템플릿 정보는 GET 요청을 통해 쿼리할 수 있습니다. 예:

GET _scripts/my_test_template
  • 1

3.4 정의된 템플릿 삭제

정의된 템플릿을 삭제해야 하는 경우 DELETE 요청을 사용할 수 있습니다. 예를 들면 다음과 같습니다.

DELETE _scripts/my_test_template
  • 1

4. 검색 템플릿의 고급 적용

4.1 검증 템플릿

엘라스틱서치가 제공하는_render/template 템플릿의 유효성을 검사하는 API입니다.