検索テンプレート

検索テンプレートは、異なる変数で実行できる保存された検索です。

Elasticsearchを検索バックエンドとして使用する場合、検索バーからのユーザー入力を検索テンプレートのパラメータとして渡すことができます。これにより、ユーザーにElasticsearchのクエリ構文を公開することなく検索を実行できます。

カスタムアプリケーションにElasticsearchを使用する場合、検索テンプレートを使用すると、アプリのコードを変更することなく検索を変更できます。

検索テンプレートの作成

検索テンプレートを作成または更新するには、create stored script APIを使用します。

リクエストのsourceは、search APIのリクエストボディと同じパラメータをサポートします。sourceは、オープンソースプロジェクトmustache.javaからのMustache変数も受け入れます。

通常、Mustache変数は二重波括弧で囲まれています: {{my-var}}。テンプレート化された検索を実行すると、Elasticsearchはこれらの変数をparamsからの値に置き換えます。mustache構文の詳細については、Mustache.jsマニュアルを参照してください。検索テンプレートはlangmustacheを使用する必要があります。

次のリクエストは、idmy-search-templateを持つ検索テンプレートを作成します。

Python

  1. resp = client.put_script(
  2. id="my-search-template",
  3. script={
  4. "lang": "mustache",
  5. "source": {
  6. "query": {
  7. "match": {
  8. "message": "{{query_string}}"
  9. }
  10. },
  11. "from": "{{from}}",
  12. "size": "{{size}}"
  13. }
  14. },
  15. )
  16. print(resp)

Ruby

  1. response = client.put_script(
  2. id: 'my-search-template',
  3. body: {
  4. script: {
  5. lang: 'mustache',
  6. source: {
  7. query: {
  8. match: {
  9. message: '{{query_string}}'
  10. }
  11. },
  12. from: '{{from}}',
  13. size: '{{size}}'
  14. }
  15. }
  16. }
  17. )
  18. puts response

Js

  1. const response = await client.putScript({
  2. id: "my-search-template",
  3. script: {
  4. lang: "mustache",
  5. source: {
  6. query: {
  7. match: {
  8. message: "{{query_string}}",
  9. },
  10. },
  11. from: "{{from}}",
  12. size: "{{size}}",
  13. },
  14. },
  15. });
  16. console.log(response);

コンソール

  1. PUT _scripts/my-search-template
  2. {
  3. "script": {
  4. "lang": "mustache",
  5. "source": {
  6. "query": {
  7. "match": {
  8. "message": "{{query_string}}"
  9. }
  10. },
  11. "from": "{{from}}",
  12. "size": "{{size}}"
  13. }
  14. }
  15. }

Elasticsearchは、検索テンプレートをクラスタ状態のMustache scriptsとして保存します。Elasticsearchはtemplateスクリプトコンテキストで検索テンプレートをコンパイルします。スクリプトを制限または無効にする設定は、検索テンプレートにも影響します。

検索テンプレートの検証

異なるparamsでテンプレートをテストするには、render search template APIを使用します。

Python

  1. resp = client.render_search_template(
  2. id="my-search-template",
  3. params={
  4. "query_string": "hello world",
  5. "from": 20,
  6. "size": 10
  7. },
  8. )
  9. print(resp)

Ruby

  1. response = client.render_search_template(
  2. body: {
  3. id: 'my-search-template',
  4. params: {
  5. query_string: 'hello world',
  6. from: 20,
  7. size: 10
  8. }
  9. }
  10. )
  11. puts response

Js

  1. const response = await client.renderSearchTemplate({
  2. id: "my-search-template",
  3. params: {
  4. query_string: "hello world",
  5. from: 20,
  6. size: 10,
  7. },
  8. });
  9. console.log(response);

コンソール

  1. POST _render/template
  2. {
  3. "id": "my-search-template",
  4. "params": {
  5. "query_string": "hello world",
  6. "from": 20,
  7. "size": 10
  8. }
  9. }

レンダリングされると、テンプレートはsearch request bodyを出力します。

コンソール-結果

  1. {
  2. "template_output": {
  3. "query": {
  4. "match": {
  5. "message": "hello world"
  6. }
  7. },
  8. "from": "20",
  9. "size": "10"
  10. }
  11. }

APIを使用してインラインテンプレートをテストすることもできます。

Python

  1. resp = client.render_search_template(
  2. source={
  3. "query": {
  4. "match": {
  5. "message": "{{query_string}}"
  6. }
  7. },
  8. "from": "{{from}}",
  9. "size": "{{size}}"
  10. },
  11. params={
  12. "query_string": "hello world",
  13. "from": 20,
  14. "size": 10
  15. },
  16. )
  17. print(resp)

Ruby

  1. response = client.render_search_template(
  2. body: {
  3. source: {
  4. query: {
  5. match: {
  6. message: '{{query_string}}'
  7. }
  8. },
  9. from: '{{from}}',
  10. size: '{{size}}'
  11. },
  12. params: {
  13. query_string: 'hello world',
  14. from: 20,
  15. size: 10
  16. }
  17. }
  18. )
  19. puts response

Js

  1. const response = await client.renderSearchTemplate({
  2. source: {
  3. query: {
  4. match: {
  5. message: "{{query_string}}",
  6. },
  7. },
  8. from: "{{from}}",
  9. size: "{{size}}",
  10. },
  11. params: {
  12. query_string: "hello world",
  13. from: 20,
  14. size: 10,
  15. },
  16. });
  17. console.log(response);

コンソール

  1. POST _render/template
  2. {
  3. "source": {
  4. "query": {
  5. "match": {
  6. "message": "{{query_string}}"
  7. }
  8. },
  9. "from": "{{from}}",
  10. "size": "{{size}}"
  11. },
  12. "params": {
  13. "query_string": "hello world",
  14. "from": 20,
  15. "size": 10
  16. }
  17. }

テンプレート化された検索の実行

検索テンプレートを使用して検索を実行するには、search template APIを使用します。各リクエストで異なるparamsを指定できます。

Python

  1. resp = client.search_template(
  2. index="my-index",
  3. id="my-search-template",
  4. params={
  5. "query_string": "hello world",
  6. "from": 0,
  7. "size": 10
  8. },
  9. )
  10. print(resp)

Ruby

  1. response = client.search_template(
  2. index: 'my-index',
  3. body: {
  4. id: 'my-search-template',
  5. params: {
  6. query_string: 'hello world',
  7. from: 0,
  8. size: 10
  9. }
  10. }
  11. )
  12. puts response

Js

  1. const response = await client.searchTemplate({
  2. index: "my-index",
  3. id: "my-search-template",
  4. params: {
  5. query_string: "hello world",
  6. from: 0,
  7. size: 10,
  8. },
  9. });
  10. console.log(response);

コンソール

  1. GET my-index/_search/template
  2. {
  3. "id": "my-search-template",
  4. "params": {
  5. "query_string": "hello world",
  6. "from": 0,
  7. "size": 10
  8. }
  9. }

レスポンスは、search APIのレスポンスと同じプロパティを使用します。

コンソール-結果

  1. {
  2. "took": 36,
  3. "timed_out": false,
  4. "_shards": {
  5. "total": 1,
  6. "successful": 1,
  7. "skipped": 0,
  8. "failed": 0
  9. },
  10. "hits": {
  11. "total": {
  12. "value": 1,
  13. "relation": "eq"
  14. },
  15. "max_score": 0.5753642,
  16. "hits": [
  17. {
  18. "_index": "my-index",
  19. "_id": "1",
  20. "_score": 0.5753642,
  21. "_source": {
  22. "message": "hello world"
  23. }
  24. }
  25. ]
  26. }
  27. }

複数のテンプレート化された検索の実行

単一のリクエストで複数のテンプレート化された検索を実行するには、multi search template APIを使用します。これらのリクエストは、複数の個別の検索よりもオーバーヘッドが少なく、速度が速いことがよくあります。

Python

  1. resp = client.msearch_template(
  2. index="my-index",
  3. search_templates=[
  4. {},
  5. {
  6. "id": "my-search-template",
  7. "params": {
  8. "query_string": "hello world",
  9. "from": 0,
  10. "size": 10
  11. }
  12. },
  13. {},
  14. {
  15. "id": "my-other-search-template",
  16. "params": {
  17. "query_type": "match_all"
  18. }
  19. }
  20. ],
  21. )
  22. print(resp)

Ruby

  1. response = client.msearch_template(
  2. index: 'my-index',
  3. body: [
  4. {},
  5. {
  6. id: 'my-search-template',
  7. params: {
  8. query_string: 'hello world',
  9. from: 0,
  10. size: 10
  11. }
  12. },
  13. {},
  14. {
  15. id: 'my-other-search-template',
  16. params: {
  17. query_type: 'match_all'
  18. }
  19. }
  20. ]
  21. )
  22. puts response

Js

  1. const response = await client.msearchTemplate({
  2. index: "my-index",
  3. search_templates: [
  4. {},
  5. {
  6. id: "my-search-template",
  7. params: {
  8. query_string: "hello world",
  9. from: 0,
  10. size: 10,
  11. },
  12. },
  13. {},
  14. {
  15. id: "my-other-search-template",
  16. params: {
  17. query_type: "match_all",
  18. },
  19. },
  20. ],
  21. });
  22. console.log(response);

コンソール

  1. GET my-index/_msearch/template
  2. { }
  3. { "id": "my-search-template", "params": { "query_string": "hello world", "from": 0, "size": 10 }}
  4. { }
  5. { "id": "my-other-search-template", "params": { "query_type": "match_all" }}

検索テンプレートの取得

検索テンプレートを取得するには、get stored script APIを使用します。

Python

  1. resp = client.get_script(
  2. id="my-search-template",
  3. )
  4. print(resp)

Ruby

  1. response = client.get_script(
  2. id: 'my-search-template'
  3. )
  4. puts response

Js

  1. const response = await client.getScript({
  2. id: "my-search-template",
  3. });
  4. console.log(response);

コンソール

  1. GET _scripts/my-search-template

すべての検索テンプレートと他の保存されたスクリプトのリストを取得するには、cluster state APIを使用します。

Python

  1. resp = client.cluster.state(
  2. metric="metadata",
  3. pretty=True,
  4. filter_path="metadata.stored_scripts",
  5. )
  6. print(resp)

Ruby

  1. response = client.cluster.state(
  2. metric: 'metadata',
  3. pretty: true,
  4. filter_path: 'metadata.stored_scripts'
  5. )
  6. puts response

Js

  1. const response = await client.cluster.state({
  2. metric: "metadata",
  3. pretty: "true",
  4. filter_path: "metadata.stored_scripts",
  5. });
  6. console.log(response);

コンソール

  1. GET _cluster/state/metadata?pretty&filter_path=metadata.stored_scripts

検索テンプレートの削除

検索テンプレートを削除するには、delete stored script APIを使用します。

Python

  1. resp = client.delete_script(
  2. id="my-search-template",
  3. )
  4. print(resp)

Ruby

  1. response = client.delete_script(
  2. id: 'my-search-template'
  3. )
  4. puts response

Js

  1. const response = await client.deleteScript({
  2. id: "my-search-template",
  3. });
  4. console.log(response);

コンソール

  1. DELETE _scripts/my-search-template

デフォルト値の設定

変数のデフォルト値を設定するには、次の構文を使用します:

Mustache

  1. {{my-var}}{{^my-var}}default value{{/my-var}}

テンプレート化された検索がparamsに値を指定しない場合、検索は代わりにデフォルト値を使用します。たとえば、次のテンプレートはfromsizeのデフォルトを設定します。

Python

  1. resp = client.render_search_template(
  2. source={
  3. "query": {
  4. "match": {
  5. "message": "{{query_string}}"
  6. }
  7. },
  8. "from": "{{from}}{{^from}}0{{/from}}",
  9. "size": "{{size}}{{^size}}10{{/size}}"
  10. },
  11. params={
  12. "query_string": "hello world"
  13. },
  14. )
  15. print(resp)

Ruby

  1. response = client.render_search_template(
  2. body: {
  3. source: {
  4. query: {
  5. match: {
  6. message: '{{query_string}}'
  7. }
  8. },
  9. from: '{{from}}{{^from}}0{{/from}}',
  10. size: '{{size}}{{^size}}10{{/size}}'
  11. },
  12. params: {
  13. query_string: 'hello world'
  14. }
  15. }
  16. )
  17. puts response

Js

  1. const response = await client.renderSearchTemplate({
  2. source: {
  3. query: {
  4. match: {
  5. message: "{{query_string}}",
  6. },
  7. },
  8. from: "{{from}}{{^from}}0{{/from}}",
  9. size: "{{size}}{{^size}}10{{/size}}",
  10. },
  11. params: {
  12. query_string: "hello world",
  13. },
  14. });
  15. console.log(response);

コンソール

  1. POST _render/template
  2. {
  3. "source": {
  4. "query": {
  5. "match": {
  6. "message": "{{query_string}}"
  7. }
  8. },
  9. "from": "{{from}}{{^from}}0{{/from}}",
  10. "size": "{{size}}{{^size}}10{{/size}}"
  11. },
  12. "params": {
  13. "query_string": "hello world"
  14. }
  15. }

URLエンコードされた文字列

  1. #### Python
  2. ``````python
  3. resp = client.render_search_template(
  4. source={
  5. "query": {
  6. "term": {
  7. "url.full": "{{#url}}{{host}}/{{page}}{{/url}}"
  8. }
  9. }
  10. },
  11. params={
  12. "host": "http://example.com",
  13. "page": "hello-world"
  14. },
  15. )
  16. print(resp)
  17. `

Ruby

  1. response = client.render_search_template(
  2. body: {
  3. source: {
  4. query: {
  5. term: {
  6. 'url.full' => '{{#url}}{{host}}/{{page}}{{/url}}'
  7. }
  8. }
  9. },
  10. params: {
  11. host: 'http://example.com',
  12. page: 'hello-world'
  13. }
  14. }
  15. )
  16. puts response

Js

  1. const response = await client.renderSearchTemplate({
  2. source: {
  3. query: {
  4. term: {
  5. "url.full": "{{#url}}{{host}}/{{page}}{{/url}}",
  6. },
  7. },
  8. },
  9. params: {
  10. host: "http://example.com",
  11. page: "hello-world",
  12. },
  13. });
  14. console.log(response);

コンソール

  1. POST _render/template
  2. {
  3. "source": {
  4. "query": {
  5. "term": {
  6. "url.full": "{{#url}}{{host}}/{{page}}{{/url}}"
  7. }
  8. }
  9. },
  10. "params": {
  11. "host": "http://example.com",
  12. "page": "hello-world"
  13. }
  14. }

テンプレートは次のようにレンダリングされます:

コンソール-結果

  1. {
  2. "template_output": {
  3. "query": {
  4. "term": {
  5. "url.full": "http%3A%2F%2Fexample.com%2Fhello-world"
  6. }
  7. }
  8. }
  9. }

値の連結

  1. #### Python
  2. ``````python
  3. resp = client.render_search_template(
  4. source={
  5. "query": {
  6. "match": {
  7. "user.group.emails": "{{#join}}emails{{/join}}"
  8. }
  9. }
  10. },
  11. params={
  12. "emails": [
  13. "[email protected]",
  14. "[email protected]"
  15. ]
  16. },
  17. )
  18. print(resp)
  19. `

Ruby

  1. response = client.render_search_template(
  2. body: {
  3. source: {
  4. query: {
  5. match: {
  6. 'user.group.emails' => '{{#join}}emails{{/join}}'
  7. }
  8. }
  9. },
  10. params: {
  11. emails: [
  12. '[email protected]',
  13. '[email protected]'
  14. ]
  15. }
  16. }
  17. )
  18. puts response

Js

  1. const response = await client.renderSearchTemplate({
  2. source: {
  3. query: {
  4. match: {
  5. "user.group.emails": "{{#join}}emails{{/join}}",
  6. },
  7. },
  8. },
  9. params: {
  10. emails: ["[email protected]", "[email protected]"],
  11. },
  12. });
  13. console.log(response);

コンソール

  1. POST _render/template
  2. {
  3. "source": {
  4. "query": {
  5. "match": {
  6. "user.group.emails": "{{#join}}emails{{/join}}"
  7. }
  8. }
  9. },
  10. "params": {
  11. "emails": [ "[email protected]", "[email protected]" ]
  12. }
  13. }

テンプレートは次のようにレンダリングされます:

コンソール-結果

  1. {
  2. "template_output": {
  3. "query": {
  4. "match": {
  5. "user.group.emails": "[email protected],[email protected]"
  6. }
  7. }
  8. }
  9. }

カスタム区切り文字を指定することもできます。

Python

  1. resp = client.render_search_template(
  2. source={
  3. "query": {
  4. "range": {
  5. "user.effective.date": {
  6. "gte": "{{date.min}}",
  7. "lte": "{{date.max}}",
  8. "format": "{{#join delimiter='||'}}date.formats{{/join delimiter='||'}}"
  9. }
  10. }
  11. }
  12. },
  13. params={
  14. "date": {
  15. "min": "2098",
  16. "max": "06/05/2099",
  17. "formats": [
  18. "dd/MM/yyyy",
  19. "yyyy"
  20. ]
  21. }
  22. },
  23. )
  24. print(resp)

Ruby

  1. response = client.render_search_template(
  2. body: {
  3. source: {
  4. query: {
  5. range: {
  6. 'user.effective.date' => {
  7. gte: '{{date.min}}',
  8. lte: '{{date.max}}',
  9. format: "{{#join delimiter='||'}}date.formats{{/join delimiter='||'}}"
  10. }
  11. }
  12. }
  13. },
  14. params: {
  15. date: {
  16. min: '2098',
  17. max: '06/05/2099',
  18. formats: [
  19. 'dd/MM/yyyy',
  20. 'yyyy'
  21. ]
  22. }
  23. }
  24. }
  25. )
  26. puts response

Js

  1. const response = await client.renderSearchTemplate({
  2. source: {
  3. query: {
  4. range: {
  5. "user.effective.date": {
  6. gte: "{{date.min}}",
  7. lte: "{{date.max}}",
  8. format:
  9. "{{#join delimiter='||'}}date.formats{{/join delimiter='||'}}",
  10. },
  11. },
  12. },
  13. },
  14. params: {
  15. date: {
  16. min: "2098",
  17. max: "06/05/2099",
  18. formats: ["dd/MM/yyyy", "yyyy"],
  19. },
  20. },
  21. });
  22. console.log(response);

コンソール

  1. POST _render/template
  2. {
  3. "source": {
  4. "query": {
  5. "range": {
  6. "user.effective.date": {
  7. "gte": "{{date.min}}",
  8. "lte": "{{date.max}}",
  9. "format": "{{#join delimiter='||'}}date.formats{{/join delimiter='||'}}"
  10. }
  11. }
  12. }
  13. },
  14. "params": {
  15. "date": {
  16. "min": "2098",
  17. "max": "06/05/2099",
  18. "formats": ["dd/MM/yyyy", "yyyy"]
  19. }
  20. }
  21. }

テンプレートは次のようにレンダリングされます:

コンソール-結果

  1. {
  2. "template_output": {
  3. "query": {
  4. "range": {
  5. "user.effective.date": {
  6. "gte": "2098",
  7. "lte": "06/05/2099",
  8. "format": "dd/MM/yyyy||yyyy"
  9. }
  10. }
  11. }
  12. }
  13. }

JSONへの変換

  1. たとえば、次のテンプレートは`````{{#toJson}}`````を使用して配列を渡します。リクエストボディが有効なJSONであることを確認するために、`````source`````は文字列形式で書かれます。
  2. #### Python
  3. ``````python
  4. resp = client.render_search_template(
  5. source="{ \"query\": { \"terms\": { \"tags\": {{#toJson}}tags{{/toJson}} }}}",
  6. params={
  7. "tags": [
  8. "prod",
  9. "es01"
  10. ]
  11. },
  12. )
  13. print(resp)
  14. `

Ruby

  1. response = client.render_search_template(
  2. body: {
  3. source: '{ "query": { "terms": { "tags": {{#toJson}}tags{{/toJson}} }}}',
  4. params: {
  5. tags: [
  6. 'prod',
  7. 'es01'
  8. ]
  9. }
  10. }
  11. )
  12. puts response

Js

  1. const response = await client.renderSearchTemplate({
  2. source: '{ "query": { "terms": { "tags": {{#toJson}}tags{{/toJson}} }}}',
  3. params: {
  4. tags: ["prod", "es01"],
  5. },
  6. });
  7. console.log(response);

コンソール

  1. POST _render/template
  2. {
  3. "source": "{ \"query\": { \"terms\": { \"tags\": {{#toJson}}tags{{/toJson}} }}}",
  4. "params": {
  5. "tags": [
  6. "prod",
  7. "es01"
  8. ]
  9. }
  10. }

テンプレートは次のようにレンダリングされます:

コンソール-結果

  1. {
  2. "template_output": {
  3. "query": {
  4. "terms": {
  5. "tags": [
  6. "prod",
  7. "es01"
  8. ]
  9. }
  10. }
  11. }
  12. }

オブジェクトを渡すために{{#toJson}}を使用することもできます。

Python

  1. resp = client.render_search_template(
  2. source="{ \"query\": {{#toJson}}my_query{{/toJson}} }",
  3. params={
  4. "my_query": {
  5. "match_all": {}
  6. }
  7. },
  8. )
  9. print(resp)

Ruby

  1. response = client.render_search_template(
  2. body: {
  3. source: '{ "query": {{#toJson}}my_query{{/toJson}} }',
  4. params: {
  5. my_query: {
  6. match_all: {}
  7. }
  8. }
  9. }
  10. )
  11. puts response

Js

  1. const response = await client.renderSearchTemplate({
  2. source: '{ "query": {{#toJson}}my_query{{/toJson}} }',
  3. params: {
  4. my_query: {
  5. match_all: {},
  6. },
  7. },
  8. });
  9. console.log(response);

コンソール

  1. POST _render/template
  2. {
  3. "source": "{ \"query\": {{#toJson}}my_query{{/toJson}} }",
  4. "params": {
  5. "my_query": {
  6. "match_all": { }
  7. }
  8. }
  9. }

テンプレートは次のようにレンダリングされます:

コンソール-結果

  1. {
  2. "template_output" : {
  3. "query" : {
  4. "match_all" : { }
  5. }
  6. }
  7. }

オブジェクトの配列を渡すこともできます。

Python

  1. resp = client.render_search_template(
  2. source="{ \"query\": { \"bool\": { \"must\": {{#toJson}}clauses{{/toJson}} }}}",
  3. params={
  4. "clauses": [
  5. {
  6. "term": {
  7. "user.id": "kimchy"
  8. }
  9. },
  10. {
  11. "term": {
  12. "url.domain": "example.com"
  13. }
  14. }
  15. ]
  16. },
  17. )
  18. print(resp)

Ruby

  1. response = client.render_search_template(
  2. body: {
  3. source: '{ "query": { "bool": { "must": {{#toJson}}clauses{{/toJson}} }}}',
  4. params: {
  5. clauses: [
  6. {
  7. term: {
  8. 'user.id' => 'kimchy'
  9. }
  10. },
  11. {
  12. term: {
  13. 'url.domain' => 'example.com'
  14. }
  15. }
  16. ]
  17. }
  18. }
  19. )
  20. puts response

Js

  1. const response = await client.renderSearchTemplate({
  2. source: '{ "query": { "bool": { "must": {{#toJson}}clauses{{/toJson}} }}}',
  3. params: {
  4. clauses: [
  5. {
  6. term: {
  7. "user.id": "kimchy",
  8. },
  9. },
  10. {
  11. term: {
  12. "url.domain": "example.com",
  13. },
  14. },
  15. ],
  16. },
  17. });
  18. console.log(response);

コンソール

  1. POST _render/template
  2. {
  3. "source": "{ \"query\": { \"bool\": { \"must\": {{#toJson}}clauses{{/toJson}} }}}",
  4. "params": {
  5. "clauses": [
  6. {
  7. "term": {
  8. "user.id": "kimchy"
  9. }
  10. },
  11. {
  12. "term": {
  13. "url.domain": "example.com"
  14. }
  15. }
  16. ]
  17. }
  18. }

テンプレートは次のようにレンダリングされます:

コンソール-結果

  1. {
  2. "template_output": {
  3. "query": {
  4. "bool": {
  5. "must": [
  6. {
  7. "term": {
  8. "user.id": "kimchy"
  9. }
  10. },
  11. {
  12. "term": {
  13. "url.domain": "example.com"
  14. }
  15. }
  16. ]
  17. }
  18. }
  19. }
  20. }

条件の使用

if条件を作成するには、次の構文を使用します:

Mustache

  1. {{#condition}}content{{/condition}}

条件変数がtrueの場合、Elasticsearchはその内容を表示します。たとえば、次のテンプレートはyear_scopetrueの場合、過去1年のデータを検索します。

Python

  1. resp = client.render_search_template(
  2. source="{ \"query\": { \"bool\": { \"filter\": [ {{#year_scope}} { \"range\": { \"@timestamp\": { \"gte\": \"now-1y/d\", \"lt\": \"now/d\" } } }, {{/year_scope}} { \"term\": { \"user.id\": \"{{user_id}}\" }}]}}}",
  3. params={
  4. "year_scope": True,
  5. "user_id": "kimchy"
  6. },
  7. )
  8. print(resp)

Ruby

  1. response = client.render_search_template(
  2. body: {
  3. source: '{ "query": { "bool": { "filter": [ {{#year_scope}} { "range": { "@timestamp": { "gte": "now-1y/d", "lt": "now/d" } } }, {{/year_scope}} { "term": { "user.id": "{{user_id}}" }}]}}}',
  4. params: {
  5. year_scope: true,
  6. user_id: 'kimchy'
  7. }
  8. }
  9. )
  10. puts response

Js

  1. const response = await client.renderSearchTemplate({
  2. source:
  3. '{ "query": { "bool": { "filter": [ {{#year_scope}} { "range": { "@timestamp": { "gte": "now-1y/d", "lt": "now/d" } } }, {{/year_scope}} { "term": { "user.id": "{{user_id}}" }}]}}}',
  4. params: {
  5. year_scope: true,
  6. user_id: "kimchy",
  7. },
  8. });
  9. console.log(response);

コンソール

  1. POST _render/template
  2. {
  3. "source": "{ \"query\": { \"bool\": { \"filter\": [ {{#year_scope}} { \"range\": { \"@timestamp\": { \"gte\": \"now-1y/d\", \"lt\": \"now/d\" } } }, {{/year_scope}} { \"term\": { \"user.id\": \"{{user_id}}\" }}]}}}",
  4. "params": {
  5. "year_scope": true,
  6. "user_id": "kimchy"
  7. }
  8. }

テンプレートは次のようにレンダリングされます:

コンソール-結果

  1. {
  2. "template_output" : {
  3. "query" : {
  4. "bool" : {
  5. "filter" : [
  6. {
  7. "range" : {
  8. "@timestamp" : {
  9. "gte" : "now-1y/d",
  10. "lt" : "now/d"
  11. }
  12. }
  13. },
  14. {
  15. "term" : {
  16. "user.id" : "kimchy"
  17. }
  18. }
  19. ]
  20. }
  21. }
  22. }
  23. }
  1. #### Python
  2. ``````python
  3. resp = client.render_search_template(
  4. source="{ \"query\": { \"bool\": { \"filter\": [ {{#year_scope}} { \"range\": { \"@timestamp\": { \"gte\": \"now-1y/d\", \"lt\": \"now/d\" } } }, {{/year_scope}} { \"term\": { \"user.id\": \"{{user_id}}\" }}]}}}",
  5. params={
  6. "year_scope": False,
  7. "user_id": "kimchy"
  8. },
  9. )
  10. print(resp)
  11. `

Ruby

  1. response = client.render_search_template(
  2. body: {
  3. source: '{ "query": { "bool": { "filter": [ {{#year_scope}} { "range": { "@timestamp": { "gte": "now-1y/d", "lt": "now/d" } } }, {{/year_scope}} { "term": { "user.id": "{{user_id}}" }}]}}}',
  4. params: {
  5. year_scope: false,
  6. user_id: 'kimchy'
  7. }
  8. }
  9. )
  10. puts response

Js

  1. const response = await client.renderSearchTemplate({
  2. source:
  3. '{ "query": { "bool": { "filter": [ {{#year_scope}} { "range": { "@timestamp": { "gte": "now-1y/d", "lt": "now/d" } } }, {{/year_scope}} { "term": { "user.id": "{{user_id}}" }}]}}}',
  4. params: {
  5. year_scope: false,
  6. user_id: "kimchy",
  7. },
  8. });
  9. console.log(response);

コンソール

  1. POST _render/template
  2. {
  3. "source": "{ \"query\": { \"bool\": { \"filter\": [ {{#year_scope}} { \"range\": { \"@timestamp\": { \"gte\": \"now-1y/d\", \"lt\": \"now/d\" } } }, {{/year_scope}} { \"term\": { \"user.id\": \"{{user_id}}\" }}]}}}",
  4. "params": {
  5. "year_scope": false,
  6. "user_id": "kimchy"
  7. }
  8. }

テンプレートは次のようにレンダリングされます:

コンソール-結果

  1. {
  2. "template_output" : {
  3. "query" : {
  4. "bool" : {
  5. "filter" : [
  6. {
  7. "term" : {
  8. "user.id" : "kimchy"
  9. }
  10. }
  11. ]
  12. }
  13. }
  14. }
  15. }

if-else条件を作成するには、次の構文を使用します:

Mustache

  1. {{#condition}}if content{{/condition}} {{^condition}}else content{{/condition}}

たとえば、次のテンプレートはyear_scopetrueの場合、過去1年のデータを検索します。それ以外の場合は、過去1日のデータを検索します。

Python

  1. resp = client.render_search_template(
  2. source="{ \"query\": { \"bool\": { \"filter\": [ { \"range\": { \"@timestamp\": { \"gte\": {{#year_scope}} \"now-1y/d\" {{/year_scope}} {{^year_scope}} \"now-1d/d\" {{/year_scope}} , \"lt\": \"now/d\" }}}, { \"term\": { \"user.id\": \"{{user_id}}\" }}]}}}",
  3. params={
  4. "year_scope": True,
  5. "user_id": "kimchy"
  6. },
  7. )
  8. print(resp)

Ruby

  1. response = client.render_search_template(
  2. body: {
  3. source: '{ "query": { "bool": { "filter": [ { "range": { "@timestamp": { "gte": {{#year_scope}} "now-1y/d" {{/year_scope}} {{^year_scope}} "now-1d/d" {{/year_scope}} , "lt": "now/d" }}}, { "term": { "user.id": "{{user_id}}" }}]}}}',
  4. params: {
  5. year_scope: true,
  6. user_id: 'kimchy'
  7. }
  8. }
  9. )
  10. puts response

Js

  1. const response = await client.renderSearchTemplate({
  2. source:
  3. '{ "query": { "bool": { "filter": [ { "range": { "@timestamp": { "gte": {{#year_scope}} "now-1y/d" {{/year_scope}} {{^year_scope}} "now-1d/d" {{/year_scope}} , "lt": "now/d" }}}, { "term": { "user.id": "{{user_id}}" }}]}}}',
  4. params: {
  5. year_scope: true,
  6. user_id: "kimchy",
  7. },
  8. });
  9. console.log(response);

コンソール

  1. POST _render/template
  2. {
  3. "source": "{ \"query\": { \"bool\": { \"filter\": [ { \"range\": { \"@timestamp\": { \"gte\": {{#year_scope}} \"now-1y/d\" {{/year_scope}} {{^year_scope}} \"now-1d/d\" {{/year_scope}} , \"lt\": \"now/d\" }}}, { \"term\": { \"user.id\": \"{{user_id}}\" }}]}}}",
  4. "params": {
  5. "year_scope": true,
  6. "user_id": "kimchy"
  7. }
  8. }

Mustacheを使用した検索テンプレートの例

mustacheテンプレート言語は、テンプレート内で使用できるさまざまなタグタイプを定義します。次のセクションでは、これらのタグタイプのいくつかを説明し、Elasticsearchのsearch templatesでの使用例を提供します。

Mustache変数

Mustacheタグは通常、二重波括弧で囲まれています。mustache変数: {{my-variable}}は、mustacheタグの一種です。テンプレート化された検索を実行すると、Elasticsearchはこれらの変数をparamsからの値に置き換えます。

たとえば、次の検索テンプレートを考えてみてください:

Python

  1. resp = client.put_script(
  2. id="my-search-template",
  3. script={
  4. "lang": "mustache",
  5. "source": {
  6. "query": {
  7. "match": {
  8. "message": "{{query_string}}"
  9. }
  10. },
  11. "from": "{{from}}",
  12. "size": "{{size}}"
  13. }
  14. },
  15. )
  16. print(resp)

Ruby

  1. response = client.put_script(
  2. id: 'my-search-template',
  3. body: {
  4. script: {
  5. lang: 'mustache',
  6. source: {
  7. query: {
  8. match: {
  9. message: '{{query_string}}'
  10. }
  11. },
  12. from: '{{from}}',
  13. size: '{{size}}'
  14. }
  15. }
  16. }
  17. )
  18. puts response

Js

  1. const response = await client.putScript({
  2. id: "my-search-template",
  3. script: {
  4. lang: "mustache",
  5. source: {
  6. query: {
  7. match: {
  8. message: "{{query_string}}",
  9. },
  10. },
  11. from: "{{from}}",
  12. size: "{{size}}",
  13. },
  14. },
  15. });
  16. console.log(response);

コンソール

  1. PUT _scripts/my-search-template
  2. {
  3. "script": {
  4. "lang": "mustache",
  5. "source": {
  6. "query": {
  7. "match": {
  8. "message": "{{query_string}}"
  9. }
  10. },
  11. "from": "{{from}}",
  12. "size": "{{size}}"
  13. }
  14. }
  15. }

上記の検索テンプレートをparamsでテストします:

Python

  1. resp = client.render_search_template(
  2. id="my-search-template",
  3. params={
  4. "query_string": "hello world",
  5. "from": 20,
  6. "size": 10
  7. },
  8. )
  9. print(resp)

Ruby

  1. response = client.render_search_template(
  2. body: {
  3. id: 'my-search-template',
  4. params: {
  5. query_string: 'hello world',
  6. from: 20,
  7. size: 10
  8. }
  9. }
  10. )
  11. puts response

Js

  1. const response = await client.renderSearchTemplate({
  2. id: "my-search-template",
  3. params: {
  4. query_string: "hello world",
  5. from: 20,
  6. size: 10,
  7. },
  8. });
  9. console.log(response);

コンソール

  1. POST _render/template
  2. {
  3. "id": "my-search-template",
  4. "params": {
  5. "query_string": "hello world",
  6. "from": 20,
  7. "size": 10
  8. }
  9. }

レンダリングされると、{{query_string}}messagehello worldに置き換えられます。

コンソール-結果

  1. {
  2. "template_output": {
  3. "query": {
  4. "match": {
  5. "message": "hello world"
  6. }
  7. },
  8. "from": "20",
  9. "size": "10"
  10. }
  11. }

検索テンプレートがquery_stringに値を渡さない場合、メッセージは空の文字列に置き換えられます。

たとえば:

Python

  1. resp = client.render_search_template(
  2. id="my-search-template",
  3. params={
  4. "from": 20,
  5. "size": 10
  6. },
  7. )
  8. print(resp)

Ruby

  1. response = client.render_search_template(
  2. body: {
  3. id: 'my-search-template',
  4. params: {
  5. from: 20,
  6. size: 10
  7. }
  8. }
  9. )
  10. puts response

Js

  1. const response = await client.renderSearchTemplate({
  2. id: "my-search-template",
  3. params: {
  4. from: 20,
  5. size: 10,
  6. },
  7. });
  8. console.log(response);

コンソール

  1. POST _render/template
  2. {
  3. "id": "my-search-template",
  4. "params": {
  5. "from": 20,
  6. "size": 10
  7. }
  8. }

レンダリングされると、テンプレートは次のように出力されます:

コンソール-結果

  1. {
  2. "template_output": {
  3. "query": {
  4. "match": {
  5. "message": ""
  6. }
  7. },
  8. "from": "20",
  9. "size": "10"
  10. }
  11. }

セクション

セクションもMustacheタグの一種です。検索テンプレートでsectionsを使用することができます。セクションは{{#my-section-variable}}で始まり、{{/my-section-variable}}で終わります。

次の検索テンプレートは、ネストされたオブジェクトを使用したセクションの例を示しています:

Python

  1. resp = client.render_search_template(
  2. source="\n {\n \"query\": {\n \"match\": {\n {{#query_message}}\n {{#query_string}}\n \"message\": \"Hello {{#first_name_section}}{{first_name}}{{/first_name_section}} {{#last_name_section}}{{last_name}}{{/last_name_section}}\"\n {{/query_string}}\n {{/query_message}}\n }\n }\n }\n ",
  3. params={
  4. "query_message": {
  5. "query_string": {
  6. "first_name_section": {
  7. "first_name": "John"
  8. },
  9. "last_name_section": {
  10. "last_name": "kimchy"
  11. }
  12. }
  13. }
  14. },
  15. )
  16. print(resp)

Ruby

  1. response = client.render_search_template(
  2. body: {
  3. source: "\n {\n \"query\": {\n \"match\": {\n {{#query_message}}\n {{#query_string}}\n \"message\": \"Hello {{#first_name_section}}{{first_name}}{{/first_name_section}} {{#last_name_section}}{{last_name}}{{/last_name_section}}\"\n {{/query_string}}\n {{/query_message}}\n }\n }\n }\n ",
  4. params: {
  5. query_message: {
  6. query_string: {
  7. first_name_section: {
  8. first_name: 'John'
  9. },
  10. last_name_section: {
  11. last_name: 'kimchy'
  12. }
  13. }
  14. }
  15. }
  16. }
  17. )
  18. puts response

Js

  1. const response = await client.renderSearchTemplate({
  2. source:
  3. '\n {\n "query": {\n "match": {\n {{#query_message}}\n {{#query_string}}\n "message": "Hello {{#first_name_section}}{{first_name}}{{/first_name_section}} {{#last_name_section}}{{last_name}}{{/last_name_section}}"\n {{/query_string}}\n {{/query_message}}\n }\n }\n }\n ',
  4. params: {
  5. query_message: {
  6. query_string: {
  7. first_name_section: {
  8. first_name: "John",
  9. },
  10. last_name_section: {
  11. last_name: "kimchy",
  12. },
  13. },
  14. },
  15. },
  16. });
  17. console.log(response);

コンソール

  1. POST _render/template
  2. {
  3. "source":
  4. """
  5. {
  6. "query": {
  7. "match": {
  8. {{#query_message}}
  9. {{#query_string}}
  10. "message": "Hello {{#first_name_section}}{{first_name}}{{/first_name_section}} {{#last_name_section}}{{last_name}}{{/last_name_section}}"
  11. {{/query_string}}
  12. {{/query_message}}
  13. }
  14. }
  15. }
  16. """,
  17. "params": {
  18. "query_message": {
  19. "query_string": {
  20. "first_name_section": {"first_name": "John"},
  21. "last_name_section": {"last_name": "kimchy"}
  22. }
  23. }
  24. }
  25. }

テンプレートは次のようにレンダリングされます:

コンソール-結果

  1. {
  2. "template_output": {
  3. "query": {
  4. "match": {
  5. "message": "Hello John kimchy"
  6. }
  7. }
  8. }
  9. }

リスト

オブジェクトのリストを渡し、検索テンプレート内の各アイテムをループ処理できます。

たとえば、次の検索テンプレートはsectionsを組み合わせて、すべてのユーザー名に一致します:

Python

  1. resp = client.put_script(
  2. id="my-search-template",
  3. script={
  4. "lang": "mustache",
  5. "source": {
  6. "query": {
  7. "multi_match": {
  8. "query": "{{query_string}}",
  9. "fields": "[{{#text_fields}}{{user_name}},{{/text_fields}}]"
  10. }
  11. }
  12. }
  13. },
  14. )
  15. print(resp)

Ruby

  1. response = client.put_script(
  2. id: 'my-search-template',
  3. body: {
  4. script: {
  5. lang: 'mustache',
  6. source: {
  7. query: {
  8. multi_match: {
  9. query: '{{query_string}}',
  10. fields: '[{{#text_fields}}{{user_name}},{{/text_fields}}]'
  11. }
  12. }
  13. }
  14. }
  15. }
  16. )
  17. puts response

Js

  1. const response = await client.putScript({
  2. id: "my-search-template",
  3. script: {
  4. lang: "mustache",
  5. source: {
  6. query: {
  7. multi_match: {
  8. query: "{{query_string}}",
  9. fields: "[{{#text_fields}}{{user_name}},{{/text_fields}}]",
  10. },
  11. },
  12. },
  13. },
  14. });
  15. console.log(response);

コンソール

  1. PUT _scripts/my-search-template
  2. {
  3. "script": {
  4. "lang": "mustache",
  5. "source": {
  6. "query":{
  7. "multi_match":{
  8. "query": "{{query_string}}",
  9. "fields": """[{{#text_fields}}{{user_name}},{{/text_fields}}]"""
  10. }
  11. }
  12. }
  13. }
  14. }

テンプレートをテストします:

Python

  1. resp = client.render_search_template(
  2. id="my-search-template",
  3. params={
  4. "query_string": "My string",
  5. "text_fields": [
  6. {
  7. "user_name": "John"
  8. },
  9. {
  10. "user_name": "kimchy"
  11. }
  12. ]
  13. },
  14. )
  15. print(resp)

Ruby

  1. response = client.render_search_template(
  2. body: {
  3. id: 'my-search-template',
  4. params: {
  5. query_string: 'My string',
  6. text_fields: [
  7. {
  8. user_name: 'John'
  9. },
  10. {
  11. user_name: 'kimchy'
  12. }
  13. ]
  14. }
  15. }
  16. )
  17. puts response

Js

  1. const response = await client.renderSearchTemplate({
  2. id: "my-search-template",
  3. params: {
  4. query_string: "My string",
  5. text_fields: [
  6. {
  7. user_name: "John",
  8. },
  9. {
  10. user_name: "kimchy",
  11. },
  12. ],
  13. },
  14. });
  15. console.log(response);

コンソール

  1. POST _render/template
  2. {
  3. "id": "my-search-template",
  4. "params": {
  5. "query_string": "My string",
  6. "text_fields": [
  7. {
  8. "user_name": "John"
  9. },
  10. {
  11. "user_name": "kimchy"
  12. }
  13. ]
  14. }
  15. }

レンダリングされると、テンプレートは次のように出力されます:

コンソール-結果

  1. {
  2. "template_output": {
  3. "query": {
  4. "multi_match": {
  5. "query": "My string",
  6. "fields": "[John,kimchy,]"
  7. }
  8. }
  9. }
  10. }

上記はトレーリングカンマの問題を引き起こし、無効なJSONを引き起こします。回避策は、inverted sectionを含め、配列の最後のアイテムであることを確認するために変数を追加することです。

たとえば:

Python

  1. resp = client.put_script(
  2. id="my-search-template",
  3. script={
  4. "lang": "mustache",
  5. "source": {
  6. "query": {
  7. "multi_match": {
  8. "query": "{{query_string}}",
  9. "fields": "[{{#text_fields}}{{user_name}}{{^last}},{{/last}}{{/text_fields}}]"
  10. }
  11. }
  12. }
  13. },
  14. )
  15. print(resp)

Ruby

  1. response = client.put_script(
  2. id: 'my-search-template',
  3. body: {
  4. script: {
  5. lang: 'mustache',
  6. source: {
  7. query: {
  8. multi_match: {
  9. query: '{{query_string}}',
  10. fields: '[{{#text_fields}}{{user_name}}{{^last}},{{/last}}{{/text_fields}}]'
  11. }
  12. }
  13. }
  14. }
  15. }
  16. )
  17. puts response

Js

  1. const response = await client.putScript({
  2. id: "my-search-template",
  3. script: {
  4. lang: "mustache",
  5. source: {
  6. query: {
  7. multi_match: {
  8. query: "{{query_string}}",
  9. fields:
  10. "[{{#text_fields}}{{user_name}}{{^last}},{{/last}}{{/text_fields}}]",
  11. },
  12. },
  13. },
  14. },
  15. });
  16. console.log(response);

コンソール

  1. PUT _scripts/my-search-template
  2. {
  3. "script": {
  4. "lang": "mustache",
  5. "source": {
  6. "query":{
  7. "multi_match":{
  8. "query": "{{query_string}}",
  9. "fields": """[{{#text_fields}}{{user_name}}{{^last}},{{/last}}{{/text_fields}}]"""
  10. }
  11. }
  12. }
  13. }
  14. }
  1. #### Python
  2. ``````python
  3. resp = client.render_search_template(
  4. id="my-search-template",
  5. params={
  6. "query_string": "My string",
  7. "text_fields": [
  8. {
  9. "user_name": "John",
  10. "last": False
  11. },
  12. {
  13. "user_name": "kimchy",
  14. "last": True
  15. }
  16. ]
  17. },
  18. )
  19. print(resp)
  20. `

Ruby

  1. response = client.render_search_template(
  2. body: {
  3. id: 'my-search-template',
  4. params: {
  5. query_string: 'My string',
  6. text_fields: [
  7. {
  8. user_name: 'John',
  9. last: false
  10. },
  11. {
  12. user_name: 'kimchy',
  13. last: true
  14. }
  15. ]
  16. }
  17. }
  18. )
  19. puts response

Js

  1. const response = await client.renderSearchTemplate({
  2. id: "my-search-template",
  3. params: {
  4. query_string: "My string",
  5. text_fields: [
  6. {
  7. user_name: "John",
  8. last: false,
  9. },
  10. {
  11. user_name: "kimchy",
  12. last: true,
  13. },
  14. ],
  15. },
  16. });
  17. console.log(response);

コンソール

  1. POST _render/template
  2. {
  3. "id": "my-search-template",
  4. "params": {
  5. "query_string": "My string",
  6. "text_fields": [
  7. {
  8. "user_name": "John",
  9. "last": false
  10. },
  11. {
  12. "user_name": "kimchy",
  13. "last": true
  14. }
  15. ]
  16. }
  17. }

レンダリングされると、テンプレートは次のように出力されます:

コンソール-結果

  1. {
  2. "template_output": {
  3. "query": {
  4. "multi_match": {
  5. "query": "My string",
  6. "fields": "[John,kimchy]"
  7. }
  8. }
  9. }
  10. }

ラムダ

Elasticsearchには、テキストを特定の形式に変換するための事前構築されたカスタム関数があります。

mustacheラムダの使用方法については、Url encode stringsConcatenate values、およびConvert to jsonの例を確認してください。

反転セクション

反転セクションは、一度だけ値を設定したい場合に便利です。

反転セクションを使用するには、次の構文を使用します:

Mustache

  1. {{^my-variable}} content {{/my-variable}}

たとえば、次の検索テンプレートでは、name_existsfalseの場合、messageHello Worldで設定され、そうでない場合は空の文字列に設定されます。

Python

  1. resp = client.render_search_template(
  2. source={
  3. "query": {
  4. "match": {
  5. "message": "{{^name_exists}}Hello World{{/name_exists}}"
  6. }
  7. }
  8. },
  9. params={
  10. "name_exists": False
  11. },
  12. )
  13. print(resp)

Ruby

  1. response = client.render_search_template(
  2. body: {
  3. source: {
  4. query: {
  5. match: {
  6. message: '{{^name_exists}}Hello World{{/name_exists}}'
  7. }
  8. }
  9. },
  10. params: {
  11. name_exists: false
  12. }
  13. }
  14. )
  15. puts response

Js

  1. const response = await client.renderSearchTemplate({
  2. source: {
  3. query: {
  4. match: {
  5. message: "{{^name_exists}}Hello World{{/name_exists}}",
  6. },
  7. },
  8. },
  9. params: {
  10. name_exists: false,
  11. },
  12. });
  13. console.log(response);

コンソール

  1. POST _render/template
  2. {
  3. "source": {
  4. "query": {
  5. "match": {
  6. "message": "{{^name_exists}}Hello World{{/name_exists}}"
  7. }
  8. }
  9. },
  10. "params": {
  11. "name_exists": false
  12. }
  13. }

これらは、conditionsdefault valuesと組み合わせることもできます。

たとえば、次の検索テンプレートでは、name_existstrueの場合、{{query_string}}の値が置き換えられます。name_existsfalseの場合、デフォルト値Worldに設定されます。

Python

  1. resp = client.render_search_template(
  2. source={
  3. "query": {
  4. "match": {
  5. "message": "Hello {{#name_exists}}{{query_string}}{{/name_exists}}{{^name_exists}}World{{/name_exists}}"
  6. }
  7. }
  8. },
  9. params={
  10. "query_string": "Kimchy",
  11. "name_exists": True
  12. },
  13. )
  14. print(resp)

Ruby

  1. response = client.render_search_template(
  2. body: {
  3. source: {
  4. query: {
  5. match: {
  6. message: 'Hello {{#name_exists}}{{query_string}}{{/name_exists}}{{^name_exists}}World{{/name_exists}}'
  7. }
  8. }
  9. },
  10. params: {
  11. query_string: 'Kimchy',
  12. name_exists: true
  13. }
  14. }
  15. )
  16. puts response

Js

  1. const response = await client.renderSearchTemplate({
  2. source: {
  3. query: {
  4. match: {
  5. message:
  6. "Hello {{#name_exists}}{{query_string}}{{/name_exists}}{{^name_exists}}World{{/name_exists}}",
  7. },
  8. },
  9. },
  10. params: {
  11. query_string: "Kimchy",
  12. name_exists: true,
  13. },
  14. });
  15. console.log(response);

コンソール

  1. POST _render/template
  2. {
  3. "source": {
  4. "query": {
  5. "match": {
  6. "message": "Hello {{#name_exists}}{{query_string}}{{/name_exists}}{{^name_exists}}World{{/name_exists}}"
  7. }
  8. }
  9. },
  10. "params": {
  11. "query_string": "Kimchy",
  12. "name_exists": true
  13. }
  14. }

レンダリングされると、テンプレートの出力:

コンソール-結果

  1. {
  2. "template_output": {
  3. "query": {
  4. "match": {
  5. "message": "Hello Kimchy"
  6. }
  7. }
  8. }
  9. }

区切り文字の設定

デフォルトの区切り文字: 二重波括弧{{my-variable}}を検索テンプレート内の任意のカスタム区切り文字に変更できます。

たとえば、次の検索テンプレートはデフォルトの区切り文字を単一の丸括弧(query_string)に変更します。

Python

  1. resp = client.put_script(
  2. id="my-search-template",
  3. script={
  4. "lang": "mustache",
  5. "source": "\n {\n \"query\": {\n \"match\": {\n {{=( )=}}\n \"message\": \"(query_string)\"\n (={{ }}=)\n }\n }\n }\n "
  6. },
  7. )
  8. print(resp)

Ruby

  1. response = client.put_script(
  2. id: 'my-search-template',
  3. body: {
  4. script: {
  5. lang: 'mustache',
  6. source: "\n {\n \"query\": {\n \"match\": {\n {{=( )=}}\n \"message\": \"(query_string)\"\n (={{ }}=)\n }\n }\n }\n "
  7. }
  8. }
  9. )
  10. puts response

Js

  1. const response = await client.putScript({
  2. id: "my-search-template",
  3. script: {
  4. lang: "mustache",
  5. source:
  6. '\n {\n "query": {\n "match": {\n {{=( )=}}\n "message": "(query_string)"\n (={{ }}=)\n }\n }\n }\n ',
  7. },
  8. });
  9. console.log(response);

コンソール

  1. PUT _scripts/my-search-template
  2. {
  3. "script": {
  4. "lang": "mustache",
  5. "source":
  6. """
  7. {
  8. "query": {
  9. "match": {
  10. {{=( )=}}
  11. "message": "(query_string)"
  12. (={{ }}=)
  13. }
  14. }
  15. }
  16. """
  17. }
  18. }

新しい区切り文字でテンプレートをテストします:

Python

  1. resp = client.render_search_template(
  2. id="my-search-template",
  3. params={
  4. "query_string": "hello world"
  5. },
  6. )
  7. print(resp)

Ruby

  1. response = client.render_search_template(
  2. body: {
  3. id: 'my-search-template',
  4. params: {
  5. query_string: 'hello world'
  6. }
  7. }
  8. )
  9. puts response

Js

  1. const response = await client.renderSearchTemplate({
  2. id: "my-search-template",
  3. params: {
  4. query_string: "hello world",
  5. },
  6. });
  7. console.log(response);

コンソール

  1. POST _render/template
  2. {
  3. "id": "my-search-template",
  4. "params": {
  5. "query_string": "hello world"
  6. }
  7. }

レンダリングされると、テンプレートは次のように出力されます:

コンソール-結果

  1. {
  2. "template_output": {
  3. "query": {
  4. "match": {
  5. "message": "hello world"
  6. }
  7. }
  8. }
  9. }

サポートされていない機能

次のmustache機能は、Elasticsearchの検索テンプレートではサポートされていません:

  • 部分