Search Template を使った検索

OpenSearch で検索する際のクエリは量が多く複雑になりがちです。そんな時に Search Template が便利です。

目次

Search Template

検索時にレスポンスボディに書いているクエリを OpenSearch に登録しておける機能です。
検索時によって可変である部分は、Mustache を使うことで外部からのパラメータを挿入することが可能です。

↓ のようなイメージ。検索ワードはqueryというパラメータで指定できるようにしています。

{
  "query": {
    "match": {
      "content": "{{query}}"
    }
  }
}

こいつに名前をつけて登録します。ここでは、sample_template という名前をつけています。

POST _scripts/sample_template
{
  "script": {
    "lang": "mustache",
    "source": """
    {
      "query": {
        "match": {
          "content": "{{query}}"
        }
      }
    }
    """,
    "params": {}
  }
}

続いて、登録したテンプレートで検索してみます。※ インデックス作成、ドキュメント登録済みの状態です。

GET /documents/_search/template
{
  "id": "sample_template",
  "params": {
    "query": "持続"
  }
}

結果

{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "max_score": 2.91971,
    "hits": [
      {
        "_index": "documents",
        "_id": "4",
        "_score": 2.91971,
        "_source": {
          "title": "グリーンテクノロジーと持続可能性",
          "content": "グリーンテクノロジーは、環境への負荷を最小限に抑えるための技術革新を指します。再生可能エネルギー、エネルギー効率の向上、廃棄物のリサイクルなど、様々な分野でグリーンテクノロジーの進化が進んでいます。これにより、地球温暖化や環境汚染といった課題に対処するための解決策が提供されています。持続可能な未来を実現するためには、グリーンテクノロジーの積極的な採用が不可欠です。",
          "created_by": "user-2"
        }
      }
    ]
  }
}

ちゃんと検索できています。

OpenSearch の検索 API のクライアントコードを書く際にも、長々とクエリを書かなくて良くて済みますし、ある程度 mapping が共通しているインデックスであれば使い回すことも可能です。

Search Template に関する便利API

Search Template を扱う時によく使う API のフォーマットを用意しておきます。

Search Template 登録

source の部分を """で囲むことによって、mustache をそのまま書くことができます。

POST _scripts/{テンプレート名}
{
  "script": {
    "lang": "mustache",
    "source": """
    {template.mustache}
    """,
    "params": {}
  }
}

同じテンプレート名を指定すれば更新も可能です。

Search Template を使用した検索

GET /{インデックス名}/_search/template
{
  "id": "{テンプレート名}",
  "params": {
    "{パラメータ}": "{値}"
  }
}

Search Template のレンダリング

実際にパラメータが挿入された状態を確認することができます。

POST _render/template
{
  "id": "{テンプレート名}",
  "params": {
    "{パラメータ}": "{値}"
  }
}

登録前の Search Template を使った検索

登録していない状態で、パラメータを挿入して検索が可能です。
Search Template 自体を作成するタイミングで便利かもです。

GET _search/template
{
  "source": {テンプレート},
  "params": {
    "{パラメータ}": "{値}"
  }
}

登録した Search Template 一覧取得

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

登録済みの Search Template の取得

登録したテンプレートの中身を確認できます。

GET _scripts/sample_template

Search Template の削除

DELETE _scripts/{テンプレート名}

おわりに

Search Template についてまとめました。
検索クエリが複雑になってきた方はぜひ使ってみてください。