テーブル値関数 (TVF) は、検索結果に対するグループ化、ランキング、ソート、トップ K フィルタリングといった後処理機能で OpenSearch SQL を拡張します。
関数一覧
| 関数 | シグネチャ | 説明 |
|---|---|---|
rankTvf | rankTvf("group_key", "sort_key", "reserved_count", (sql)) | キーフィールドで結果をグループ化し、グループごとに上位 N 件のレコードを保持し、元の行の順序を維持します |
sortTvf | sortTvf("sort_key", "reserved_count", (sql)) | 指定された順序でソートされた上位 K 件のレコードを返します |
topKTvf | topKTvf("sort_key", "reserved_count", (sql)) | 順序付けられていない結果セットから上位 K 件のレコードを返します |
enableShuffleTvf | enableShuffleTvf((sql)) | SQL の実行をサーチャーからクエリレコードサーチャー (QRS) にルーティングします |
rankTvf
rankTvf は、SQL のランクウィンドウ関数のように動作します。キーフィールドで結果をグループ化し、グループごとに上位 N 件のレコードを保持して残りを削除します。その際、元の SQL 結果のソート順は維持されます。
構文
rankTvf("group_key", "sort_key", "reserved_count", (sql))パラメーター
| パラメーター | 説明 |
|---|---|
group_key | 結果のグループ化に使用するフィールド。カンマ区切りで複数のフィールドを指定できます。グループ化をスキップする場合は、空白のままにします。 |
sort_key | 各グループ内の結果のソートに使用するフィールド。複数のフィールドを指定できます。昇順の場合は +、降順の場合は - をプレフィックスとして付けます。デフォルトは昇順です。空白にはできません。 |
reserved_count | グループごとに保持するレコード数。負の数を設定すると、各グループのすべてのレコードが保持されます。 |
sql | 結果がグループ化およびフィルタリングされる SQL ステートメント。 |
例
ブランドごとに `size` の降順で上位 1 件の結果を保持し、最終的な出力をブランドでソートします:
select * from table (
rankTvf('brand', '-size', '1', (SELECT brand, size FROM phone))
)
order by brand
limit 100sortTvf
sortTvf は、ローカルでのトップ K 機能を提供します。JOIN 操作の前にサーチャーレベルで結果をソートおよび切り捨て、元の SQL 結果の行の順序を変更します。クエリに ORDER BY 句も含まれている場合、その句はグローバルソートのために QRS にプッシュされます。
構文
sortTvf("sort_key", "reserved_count", (sql))パラメーター
| パラメーター | 説明 |
|---|---|
sort_key | 結果のソートに使用するフィールド。複数のフィールドを指定できます。昇順の場合は +、降順の場合は - をプレフィックスとして付けます。デフォルトは昇順です。空白にはできません。 |
reserved_count | 保持するレコード数。 |
sql | 結果がソートされる SQL ステートメント。 |
例
`size` の降順で上位 3 件のスマートフォンを返します:
select * from table (
sortTvf('-size', '3', (SELECT brand, size FROM phone))
)topKTvf
topKTvf は、sortTvf と同様のローカルでのトップ K 機能を提供します。主な違いは、topKTvf が順序付けられていない結果セットを返す点です。クエリに ORDER BY 句が含まれている場合、その句はグローバルソートのために QRS にプッシュされます。
構文
topKTvf("sort_key", "reserved_count", (sql))パラメーター
| パラメーター | 説明 |
|---|---|
sort_key | トップ K レコードの選択に使用するフィールド。複数のフィールドを指定できます。昇順の場合は +、降順の場合は - をプレフィックスとして付けます。デフォルトは昇順です。空白にはできません。 |
reserved_count | 保持するレコード数。 |
sql | 結果がフィルタリングされる SQL ステートメント。 |
例
`size` で上位 3 件のスマートフォンを取得します (結果の順序は保証されません):
select * from table (
topKTvf('-size', '3', (SELECT brand, size FROM phone))
)sortTvf と topKTvf の使い分け
どちらの関数もローカルでトップ K の結果を返しますが、出力の順序が異なります:
sortTvf | topKTvf | |
|---|---|---|
| 出力順序 | ソート済み (順序は保証されます) | 順序付けなし |
| 使用ケース | JOIN の前にソート済みのローカル結果が必要な場合 | トップ K レコードのみが必要で、順序は問わない場合 |
enableShuffleTvf
デフォルトでは、rankTvf によって処理される SQL ステートメントはサーチャーにプッシュダウンされます。enableShuffleTvf を使用すると、代わりに実行を QRS にルーティングできます。
構文
enableShuffleTvf((sql))例
select * from table (
enableShuffleTvf((SELECT brand, size FROM phone))
)