技術共有

Elasticsearch 検索テンプレート: クエリの再利用と共有

2024-07-12

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

Elasticsearch (ES) の日々の開発と運用では、同様のクエリを頻繁に実行する必要があるシナリオに遭遇することがよくあります。ビジネス ロジックの複雑さにより、これらのクエリには複数のフィールド、フィルター条件、集計分析が含まれる場合があります。これらの動作を最適化し、開発効率を向上させるために、Elasticsearchでは検索テンプレートの機能を提供しています。この記事では、Elasticsearch の検索テンプレートを使用してクエリを再利用および共有する方法について説明します。

1. 検索テンプレートを使用する理由

日常の開発では、ほとんどのクエリは比較的単純ですが、一部の複雑なビジネス シナリオ (金融、医療など) では、検索で数十のフィールドを渡したり返したりする必要があり、複雑なフィルタリング条件や集計分析が必要になる場合があります。 。この時点で、各クエリを手動で作成することは非効率であるだけでなく、エラーが発生しやすくなります。検索テンプレートは MySQL のストアド プロシージャや関数に似ており、定義する必要があるのは 1 回だけであり、後からコード内でテンプレートを呼び出してパラメータを渡すことで検索関数を完了できるため、開発効率とクエリの柔軟性が大幅に向上します。

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 検証テンプレート

Elasticsearch が提供するのは_render/template テンプレートを検証するための API。