事前準備
aliyun-sql プラグインは新規顧客を受け付けていません。既存顧客のみが引き続き使用できます。代わりに、公式の Elasticsearch x-pack-sql プラグインを使用することを推奨します。詳細については、「sql-search-api」をご参照ください。
aliyun-sql プラグインを使用すると、SQL ステートメントを使用して Alibaba Cloud Elasticsearch のデータをクエリできます。MySQL 5 構文と互換性があります。このプラグインは、Alibaba Cloud Elasticsearch のバージョン 6.7.0 以降、かつ 7.10.0 より前のバージョンとのみ互換性があります。サポートされているバージョンには、6.7.0、6.8.x、7.4.0、および 7.7.1 が含まれます。バージョン 7.10.0 以降はサポートされていません。
プラグインの有効化と無効化
aliyun-sql プラグインを使用する前に、Kibana コンソールの [Dev Tools] で有効にする必要があります。Kibana コンソールへのログイン方法については、「Kibana を使用したクラスターへの接続」をご参照ください。
プラグインの有効化
Kibana の [Dev Tools] で、次のコマンドを実行します。
PUT _cluster/settings { "transient": { "aliyun.sql.enabled": true } }プラグインの無効化とアンインストール
aliyun-sql プラグインをアンインストールする前に、その構成を無効にする必要があります。そうしないと、アンインストールによってトリガーされるクラスターの再起動がハングします。
プラグインの構成を無効にします。
PUT _cluster/settings { "persistent": { "aliyun.sql.enabled": null } }プラグインの構成を無効にする前にアンインストールし、再起動がハングした場合は、次のコマンドを実行してアーカイブされた構成をクリアし、再起動を再開してください。
PUT _cluster/settings { "persistent": { "archived.aliyun.sql.enabled": null } }
クイックスタート
次の例は、aliyun-sql プラグインを使用してテストデータを書き込み、JOIN クエリを実行する方法を示しています。
aliyun-sql プラグインはクエリリクエストのみをサポートし、書き込みリクエストはサポートしていません。bulk API を使用してデータを書き込むことができます。
ご利用の Alibaba Cloud Elasticsearch インスタンスの Kibana コンソールにログインします。
Kibana コンソールへのログイン方法の詳細については、「Kibana を使用したクラスターへの接続」をご参照ください。
Kibana で、[Dev Tools] > [Console] に移動し、学生情報とランキングデータを入力します。
学生情報データ:
PUT stuinfo/_doc/_bulk?refresh {"index":{"_id":"1"}} {"id":572553,"name":"xiaoming","age":"22","addr":"addr1"} {"index":{"_id":"2"}} {"id":572554,"name":"xiaowang","age":"23","addr":"addr2"} {"index":{"_id":"3"}} {"id":572555,"name":"xiaoliu","age":"21","addr":"addr3"}学生ランキングデータ:
PUT sturank/_doc/_bulk?refresh {"index":{"_id":"1"}} {"id":572553,"score":"90","sorder":"5"} {"index":{"_id":"2"}} {"id":572554,"score":"92","sorder":"3"} {"index":{"_id":"3"}} {"id":572555,"score":"86","sorder":"10"}JOIN クエリを使用して、学生の名前とランキングを取得します。
POST /_alisql { "query":"select stuinfo.name,sturank.sorder from stuinfo join sturank on stuinfo.id=sturank.id" }応答では、`columns` フィールドにカラム名とタイプが含まれ、`rows` フィールドに行データが含まれます。
{ "columns" : [ { "name" : "name", "type" : "text" }, { "name" : "sorder", "type" : "text" } ], "rows" : [ [ "xiaoming", "5" ], [ "xiaowang", "3" ], [ "xiaoliu", "10" ] ] }
基本的なクエリ
POST /_alisql エンドポイントを使用して、すべての SQL クエリを実行できます。
シンプルクエリ
POST /_alisql?pretty { "query": "select * from monitor where host='100.80.xx.xx' limit 5" }返される結果の数を設定
POST /_alisql?pretty { "query": "select * from monitor", "fetch_size": 3 }パラメーター化クエリ
POST /_alisql?pretty { "query": "select * from monitor where host= ? ", "params": [{"type":"STRING","value":"100.80.xx.xx"}], "fetch_size": 1 }
リクエストパラメーター
パラメータータイプ | パラメーター名 | 必須 | 例 | 説明 |
URL パラメーター | pretty | いいえ | なし | 応答を読みやすくフォーマットします。 |
リクエストボディパラメーター | query | はい |
| SQL クエリステートメント。 |
リクエストボディパラメーター | fetch_size | いいえ |
| クエリごとに返される行数。デフォルト: 1000。最大: 10000。10000 より大きい値を設定した場合、システムは 10000 を使用します。`limit` 句は、完全クエリまたは範囲クエリをサポートします。`fetch_size` は スクロールクエリ と同様に機能します。 |
リクエストボディパラメーター | params | いいえ |
| PreparedStatement と同様のパラメーター化クエリをサポートします。 |
応答
大規模なクエリの場合、最初の応答は `fetch_size` パラメーターで指定された行数を返し、カーソルを含みます。
{
"columns": [
{
"name": "times",
"type": "integer"
},
{
"name": "value2",
"type": "float"
},
{
"name": "host",
"type": "keyword"
},
{
"name": "region",
"type": "keyword"
},
{
"name": "measurement",
"type": "keyword"
},
{
"name": "timestamp",
"type": "date"
}
],
"rows": [
[
572575,
4649800.0,
"100.80.xx.xx",
"china-dd",
"cpu",
"2018-08-09T08:18:42.000Z"
]
],
"cursor": "u5HzAgJzY0BEWEYxWlhKNVFXNWtS****"
}パラメーター | 説明 |
columns | 名前とタイプが含まれます。各フィールドの名前とタイプを表示します。 |
rows | クエリ結果。 |
cursor | ページネーション用のカーソル。 |
デフォルトでは、各応答は 1,000 行を返します。結果セットに 1,000 行を超える行が含まれている場合、応答にカーソルが含まれなくなるか、データが返されなくなるまで、カーソルを使用して残りの行を取得し続けることができます。
スクロールクエリ
前のクエリのカーソルを使用して、次のページのデータを取得します。
クエリリクエスト
POST /_alisql?pretty { "cursor": "u5HzAgJzY0BEWEYxWlhKNVFXNWtS****" }パラメータータイプ
パラメーター
必須
説明
URL パラメーター
pretty
いいえ
応答を読みやすくフォーマットします。
リクエストボディパラメーター
cursor
はい
対応するデータをフェッチするためのカーソル値。
応答
{ "rows": [ [ 572547, 3.327459E7, "100.80.xx.xx", "china-dd", "cpu", "2018-08-09T08:19:12.000Z" ] ], "cursor": "u5HzAgJzY0BEWEYxWlhKNVFXNWtS****" }応答は基本的なクエリの応答と似ていますが、ネットワークトラフィックを削減するために `columns` フィールドは省略されています。
JSON 形式のクエリ
format=org パラメーターを使用して、結果を生の Elasticsearch JSON 形式で返すことができます。このモードは JOIN クエリをサポートしていません。
クエリリクエスト
POST /_alisql?format=org { "query": "select * from monitor where host= ? ", "params": [{"type":"STRING","value":"100.80.xx.xx"}], "fetch_size": 1 }その他のクエリパラメーターは、基本的なクエリのパラメーターと同じです。
応答
{ "_scroll_id": "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAAsWYXNEdlVJZzJTSXFfOGluOVB4Q3Z****", "took": 18, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": 2, "max_score": 1.0, "hits": [ { "_index": "monitor", "_type": "_doc", "_id": "2", "_score": 1.0, "_source": { "times": 572575, "value2": 4649800, "host": "100.80.xx.xx", "region": "china-dd", "measurement": "cpu", "timestamp": "2018-08-09T16:18:42+0800" } } ] } }応答形式は元の DSL クエリの形式と一致します。
_scroll_idパラメーターをページネーションに使用できます。
クエリの翻訳
SQL ステートメントを Elasticsearch Domain-Specific Language (DSL) ステートメントに変換できます。この機能は JOIN クエリをサポートしていません。
クエリリクエスト
POST _alisql/translate { "query": "select * from monitor where host= '100.80.xx.xx' " }応答
{ "size": 1000, "query": { "constant_score": { "filter": { "term": { "host": { "value": "100.80.xx.xx", "boost": 1.0 } } }, "boost": 1.0 } }, "_source": { "includes": [ "times", "value2", "host", "region", "measurement", "timestamp" ], "excludes": [ ] } }
JOIN クエリ
aliyun-sql プラグインは、マージ結合を使用して実装される内部結合のみをサポートします。次の制限事項に注意してください。
JOIN フィールドは、Elasticsearch ドキュメント ID に対して厳密に増加または減少する必要があります。
JOIN フィールドは数値である必要があります。文字列フィールドはサポートされていません。
デフォルトでは、テーブルごとに返される最大行数は 10,000 です。
構文:
SELECT
expression
FROM table_name
JOIN table_name
ON expression
[WHERE condition]動的クラスターパラメーター max.join.size を使用して、テーブルごとの最大行数を変更できます。たとえば、最大行数を 20,000 に設定するには、次のコマンドを実行します。
PUT /_cluster/settings
{
"transient": {
"max.join.size": 20000
}
}ネストされたフィールドとテキストフィールドのクエリ
aliyun-sql プラグインは、ネストおよびテキストフィールドのクエリをサポートします。
ネストフィールドとテキストフィールドを持つインデックスを作成します。
PUT user_info/ { "mappings":{ "_doc":{ "properties":{ "addr":{ "type":"text" }, "age":{ "type":"integer" }, "id":{ "type":"integer" }, "name":{ "type":"nested", "properties":{ "first_name":{ "type":"keyword" }, "second_name":{ "type":"keyword" } } } } } } }一括挿入を実行します。
PUT user_info/_doc/_bulk?refresh {"index":{"_id":"1"}} {"addr":"467 Hutchinson Court","age":80,"id":"1","name":[{"first_name":"lesi","second_name" : "Adams"},{"first_name":"chaochaosi","second_name" : "Aams"}]} {"index":{"_id":"2"}} {"addr":"671 Bristol Street","age":21,"id":"2","name":{"first_name":"Hattie","second_name" : "Bond"}} {"index":{"_id":"3"}} {"addr":"554 Bristol Street","age":23,"id":"3","name":{"first_name":"Hattie","second_name" : "Bond"}}ネストタイプの
second_nameフィールドをクエリします。POST _alisql { "query": "select * from user_info where name.second_name='Adams'" }レスポンス:
{ "columns" : [ { "name" : "id", "type" : "integer" }, { "name" : "addr", "type" : "text" }, { "name" : "name.first_name", "type" : "keyword" }, { "name" : "age", "type" : "integer" }, { "name" : "name.second_name", "type" : "keyword" } ], "rows" : [ [ 1, "467 Hutchinson Court", "lesi", 80, "Adams" ] ] }テキストタイプの
addrフィールドをクエリします。POST _alisql { "query": "select * from user_info where addr='Bristol'" }レスポンス:
{ "columns" : [ { "name" : "id", "type" : "integer" }, { "name" : "addr", "type" : "text" }, { "name" : "name.first_name", "type" : "keyword" }, { "name" : "age", "type" : "integer" }, { "name" : "name.second_name", "type" : "keyword" } ], "rows" : [ [ 2, "671 Bristol Street", "Hattie", 21, "Bond" ], [ 3, "554 Bristol Street", "Hattie", 23, "Bond" ] ] }
カスタム UDF 関数
ユーザー定義関数 (UDF) は、プラグインの初期化中にのみ登録できます。UDF を動的に追加することはできません。次の例は、date_format メソッドを拡張する方法を示しています。
UDF に基づく
DateFormatクラスを定義します。/** * DateFormat. */ public class DateFormat extends UDF { public String eval(DateTime time, String toFormat) { if (time == null || toFormat == null) { return null; } Date date = time.toDate(); SimpleDateFormat format = new SimpleDateFormat(toFormat); return format.format(date); } }DateFormatクラスをプラグインの初期化メソッドに追加します。udfTable.add(KeplerSqlUserDefinedScalarFunction .create("date_format" , DateFormat.class , (JavaTypeFactoryImpl) typeFactory));クエリで UDF を使用します。
select date_format(date_f,'yyyy') from date_test
SQL 構文の概要
基本的なクエリ構文
SELECT [DISTINCT] (* | expression) [[AS] alias] [, ...]
FROM table_name
[WHERE condition]
[GROUP BY expression [, ...]
[HAVING condition]]
[ORDER BY expression [ ASC | DESC ] [, ...]]
[LIMIT [offset, ] size]JOIN クエリ構文
SELECT
expression
FROM table_name
JOIN table_name
ON expression
[WHERE condition]関数と式
タイプ | 名前 | 例 | 説明 |
数値関数 | ABS |
| 数値の絶対値を返します。 |
数値関数 | ACOS |
| 数値の逆余弦を返します。 |
数値関数 | ASIN |
| 数値の逆正弦を返します。 |
数値関数 | ATAN |
| 数値の逆正接を返します。 |
数値関数 | ATAN2 |
| 2 つの数値の逆正接を返します。 |
数値関数 | CEIL |
| 数値以上の最小の整数を返します。 |
数値関数 | CBRT |
| 数値の倍精度立方根を返します。 |
数値関数 | COS |
| 数値の余弦を返します。 |
数値関数 | COT |
| 数値の余接を返します。 |
数値関数 | DEGREES |
| ラジアンを度数に変換します。 |
数値関数 | EXP または EXPM1 |
| 数値の e の累乗を返します。 |
数値関数 | FLOOR |
| 数値以下の最大の整数を返します。 |
数値関数 | SIN |
| 数値の正弦を返します。 |
数値関数 | SINH |
| 数値の双曲線正弦を返します。 |
数値関数 | SQRT |
| 数値の正の平方根を返します。 |
数値関数 | TAN |
| 数値の正接を返します。 |
数値関数 | ROUND |
| 数値を指定された小数点以下の桁数に丸めます。 |
数値関数 | RADIANS |
| 度数をラジアンに変換します。 |
数値関数 | RAND |
| 0.0 から 1.0 の間の正の倍精度値を返します。 |
数値関数 | LN |
| 数値の自然対数を返します。 |
数値関数 | LOG10 |
| 数値の常用対数を返します。 |
数値関数 | PI |
| π の値を返します。 |
数値関数 | POWER |
| 数値を指定された累乗に上げます。 |
数値関数 | TRUNCATE |
| 数値を指定された小数点以下の桁数に切り捨てます。 |
算術演算子 | + |
| 2 つの数値の合計を返します。 |
算術演算子 | - |
| 2 つの数値の差を返します。 |
算術演算子 | * |
| 2 つの数値の積を返します。 |
算術演算子 | / |
| 2 つの数値の商を返します。 |
算術演算子 | % |
| 除算後の剰余を返します。 |
論理演算子 | AND |
| 両方の条件を満たすデータを返します。 |
論理演算子 | OR |
| いずれかの条件を満たすデータを返します。 |
論理演算子 | NOT |
| 条件を満たさないデータを返します。 |
論理演算子 | IS NULL |
| 指定されたフィールドが空の場合にデータを返します。 |
論理演算子 | IS NOT NULL |
| 指定されたフィールドが空でない場合にデータを返します。 |
文字列関数 | ASCII |
| 文字の ASCII 値を返します。 |
文字列関数 | LCASE または LOWER |
| 文字列を小文字に変換します。 |
文字列関数 | UCASE または UPPER |
| 文字列を大文字に変換します。 |
文字列関数 | CHAR_LENGTH または CHARACTER_LENGTH |
| 文字列のバイト単位の長さを返します。 |
文字列関数 | TRIM |
| 文字列の先頭と末尾のスペースを削除します。 |
文字列関数 | SPACE |
| 指定された数のスペースを含む文字列を返します。 |
文字列関数 | LEFT |
| 文字列の左側から文字を抽出します。 |
文字列関数 | RIGHT |
| 文字列の右側から文字を抽出します。 |
文字列関数 | REPEAT |
| 文字列を指定された回数繰り返します。 |
文字列関数 | REPLACE |
| 部分文字列のすべての出現箇所を別の部分文字列に置き換えます。 |
文字列関数 | POSITION |
| 部分文字列の最初の出現箇所の位置を返します。 |
文字列関数 | REVERSE |
| 逆順の文字列を返します。 |
文字列関数 | LPAD |
| 文字列を指定された文字で左側から指定された長さにパディングします。 |
文字列関数 | CONCAT |
| 2 つ以上の式を結合できます。 |
文字列関数 | SUBSTRING |
| 任意の位置から始まる部分文字列を抽出します。 |
日付関数 | CURRENT_DATE |
| 現在の日付を返します。 |
日付関数 | CURRENT_TIME |
| 現在の時刻を返します。 |
日付関数 | CURRENT_TIMESTAMP |
| 現在の日付と時刻を返します。 |
日付関数 | DAYNAME |
| 日付の曜日名を返します。 |
日付関数 | DAYOFMONTH |
| 指定された日付の月を返します。 |
日付関数 | DAYOFYEAR |
| 日付の年内の日を返します。 |
日付関数 | DAYOFWEEK |
| 日付の曜日インデックスを返します。 |
日付関数 | HOUR |
| 日付の時部分を返します。 |
日付関数 | MINUTE |
| 時刻または日時の分部分を返します。 |
日付関数 | SECOND |
| 時刻または日時の2番目の部分を返します。 |
日付関数 | YEAR |
| 日付の年部分を返します。 |
日付関数 | MONTH |
| 日付の月部分を返します。 |
日付関数 | WEEK |
| 日付の週番号 (1~54) を返します。MySQL は 0~53 を使用します。 |
日付関数 | MONTHNAME |
| 日付の月名を返します。 |
日付関数 | LAST_DAY |
| 日付の月の最終日を返します。 |
日付関数 | QUARTER |
| 日付の四半期を返します。 |
日付関数 | EXTRACT |
| 年、月、日、時、分など、日付または時刻の特定の部分を返します。 |
日付関数 | DATE_FORMAT |
| 日付または時刻をフォーマットします。 |
集計関数 | MIN |
| セット内の最小値を返します。 |
集計関数 | MAX |
| セット内の最大値を返します。 |
集計関数 | AVG |
| セット内の平均値を返します。 |
集計関数 | SUM |
| セット内の値の合計を返します。 |
集計関数 | COUNT |
| 条件に一致するレコード数を返します。 |
高度な関数 | CASE |
| CASE WHEN THEN ELSE END を使用します。WHEN の条件が満たされた場合に THEN の値を返します。それ以外の場合は ELSE の値を返します。これは SELECT、WHERE、ORDER 句で使用できます。IF THEN ELSE と同様に機能します。 |