OpenSearch SQL

SQL Workbench は、1 つのステートメントで OpenSearch インデックスと DynamoDB テーブルに SQL を実行します。orders を顧客情報を持つインデックスと結合したり、インデックスに対して GROUP BY を実行したりできます。結合は DynoTable の中で実行され、OpenSearch の SQL プラグインでは実行されません。 Smart Tables のキャンバスでは、同じ結合を SQL なしで描けます。

どちらも読み取り専用で、実行にはテーブルと同じく試用中または有効なライセンスが必要です。

SQL でインデックスを指定する

テーブル名を書く場所にインデックス名を書きます。修飾のない名前は、まず DynamoDB テーブル、次に OpenSearch インデックスを指します。テーブルとインデックスが同じ名前のときは、下のクエリの例のように名前の前にエンジンを付けます: opensearch の接頭辞はインデックスだけを、dynamodb の接頭辞はテーブルだけを読み取ります。

ハイフンやドットを含む名前は、エンジンの接頭辞の後で引用符が必要です。2 つのドメインやコレクションが同じ名前のインデックスを持つ場合は曖昧になり、Workbench はどのターゲットが持っているかを示します。

エディタは FROM と JOIN の後でインデックス名を補完し、エイリアスの後ではインデックスのフィールド名と値を、各フィールドのマッピング型とともに補完します。

テーブルとインデックスを結合する

インデックスへの JOIN の結合先にできるのは:

  • ドキュメントの _id;
  • 任意の keyword、数値、date、boolean、ip のフィールド;
  • keyword サブフィールドを持つ text フィールド。

keyword サブフィールドのない text フィールドは結合先にできず、エディタが理由とともに下線を引きます。OpenSearch はそのフィールドで値全体に一致させることがないからです。テーブルへの結合はアクセスパターンの規則に従い、パーティションキーまたは パーティションキーを結合先にします。

インデックスはどちら側にも置けます。テーブルとインデックス、インデックスとテーブル、2 つのインデックス(別のドメインのインデックスどうしも含む)を結合できます。インデックスをステートメントのベースにすることもできます。

インデックスへの結合のコストは、ベースの行 1 ページにつき 1 回のまとめた検索で、行ごとに 1 リクエストではありません。Workbench が結合した DynamoDB テーブルごとに示すコストの警告は、インデックスには当てはまりません。

ステートメントのベースがインデックスの場合、その WHERE 条件のうち OpenSearch が答えられるものは検索とともに送られるので、運ばれるドキュメントが減ります。結合されるインデックスは結合キーだけで読み取られます。結合後の行には WHERE 全体があらためて適用されるため、答えは送った内容に左右されません。

インデックスで集計する

COUNT、SUM、AVG、MIN、MAX、GROUP BY、HAVING は、テーブルと同じようにインデックスでも使えます。

クエリの例

orders テーブルを、ドキュメントの id で customers インデックスと結合します:

SELECT o.orderId, o.total, c.email, c.tier
FROM orders o
JOIN customers c ON o.customerId = c._id
WHERE o.status = 'SHIPPED'

テーブルと同じ名前の orders インデックスで、ステータスごとにドキュメントを数えます:

SELECT status, COUNT(*) AS docs, AVG(total) AS avg_total
FROM opensearch.orders
GROUP BY status
ORDER BY docs DESC

orders インデックスをベースにし、customers テーブルをそのパーティションキー customerId で結合して、出荷済みの注文の合計が 1,000 を超える顧客だけを残します:

SELECT c.email, SUM(o.total) AS revenue
FROM opensearch.orders o
JOIN dynamodb.customers c ON o.customerId = c.customerId
WHERE o.status = 'SHIPPED'
GROUP BY c.email
HAVING SUM(o.total) > 1000

2 つのインデックスを結合し、ハイフンを含む名前を引用符で囲みます。services インデックスの name フィールドは keyword フィールドです:

SELECT e.message, e.level, s.owner
FROM opensearch."app-logs" e
LEFT JOIN opensearch.services s ON e.service = s.name
WHERE e.level = 'error'
orders テーブルから opensearch.products インデックスへの Workbench の JOIN を実行した結果:完了した注文と、インデックスから取得した各商品の名前とカテゴリ。
orders テーブルから opensearch.products インデックスへの Workbench の JOIN を実行した結果:完了した注文と、インデックスから取得した各商品の名前とカテゴリ。

インデックスを含む Smart Tables

Configure モードでは、テーブルを追加にテーブルと並んでインデックスが、ドメインまたはコレクションごとにまとめて表示されます。インデックスのノードには最上位のフィールドが 1 行ずつ表示され、結合先にできるフィールドだけがリレーションシップを受け付けます。リレーションシップを追加も同じフィールドを示します。

インデックスは Smart Table のベースにも、関連するメンバーにもなれます。同じ名前のテーブルとインデックスを両方メンバーにでき、インデックスには opensearch: とその名前のラベルが付きます。Data モードのフィルターは、ベースがテーブルでもインデックスでもベースに適用されます。

1 つの Smart Table に、別のドメインやコレクションにある同じ名前の 2 つのインデックスを入れることはできません。

orders テーブルをベースに、products インデックスをメンバーにした Smart Table。リレーションはインデックスの keyword フィールド productId に結ばれている。
orders テーブルをベースに、products インデックスをメンバーにした Smart Table。リレーションはインデックスの keyword フィールド productId に結ばれている。

結果をエクスポートする

インデックスを含む Workbench や Smart Table の結果は、ほかと同じくファイルにエクスポートできます: エクスポートを参照してください。

更新日