前提条件
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 コンソールの [開発ツール] で有効化する必要があります。Kibana コンソールにログインする方法については、「Connect to a cluster using 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 プラグイン はクエリリクエスト のみをサポートし、書き込みリクエストはサポートしていません。バルク API を使用してデータを書き込むことができます。
-
ご使用の Alibaba Cloud Elasticsearch インスタンス の Kibana コンソール にログインします。
Kibana コンソール へのログイン方法の詳細については、「Kibana を使用したクラスターへの接続」をご参照ください。
-
Kibana コンソール で、[開発ツール] > [コンソール] に移動し、次のコマンドを実行して学生データとランキングデータを追加します。
学生情報データ:
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" ] ] }
基本的なクエリ
すべての SQL クエリは、POST /_alisql エンドポイントを使用して実行できます。
-
単純なクエリ
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 |
name と type を含み、各フィールドの名前と型を示します。 |
|
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****" }レスポンスは基本的なクエリの場合と同様ですが、ネットワークトラフィックを削減するためにカラムフィールドは省略されます。
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 のドメイン固有言語 (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 |
|
指定したフィールドが NULL の場合にデータを返します。 |
|
論理演算子 |
IS NOT NULL |
|
指定したフィールドが 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 |
|
日付の日 (1~31) を返します。 |
|
日付関数 |
DAYOFYEAR |
|
日付に対応する年間の通算日を返します。 |
|
日付関数 |
DAYOFWEEK |
|
日付に対応する曜日インデックスを返します。 |
|
日付関数 |
HOUR |
|
日付の時刻部分 (時間) を返します。 |
|
日付関数 |
MINUTE |
|
時刻または datetime の時刻部分 (分) を返します。 |
|
日付関数 |
SECOND |
|
時刻または datetime の時刻部分 (秒) を返します。 |
|
日付関数 |
YEAR |
|
日付の年部分を返します。 |
|
日付関数 |
MONTH |
|
日付の月部分を返します。 |
|
日付関数 |
WEEK |
|
日付に対応する週番号 (1~54) を返します。MySQL では 0~53 が使用されます。 |
|
日付関数 |
MONTHNAME |
|
日付に対応する月名を返します。 |
|
日付関数 |
LAST_DAY |
|
日付に対応する月の最終日を返します。 |
|
日付関数 |
QUARTER |
|
日付に対応する四半期を返します。 |
|
日付関数 |
EXTRACT |
|
年、月、日、時、分など、日付または時刻の特定部分を返します。 |
|
日付関数 |
DATE_FORMAT |
|
日付または時刻をフォーマットして返します。 |
|
集約関数 |
MIN |
|
セット内の最小値を返します。 |
|
集約関数 |
MAX |
|
セット内の最大値を返します。 |
|
集約関数 |
AVG |
|
セット内の平均値を返します。 |
|
集約関数 |
SUM |
|
セット内の値の合計を返します。 |
|
集約関数 |
COUNT |
|
条件に一致するレコード数を返します。 |
|
高度な関数 |
CASE |
|
WHEN 句の条件が満たされた場合に THEN 句の値を、それ以外の場合は ELSE 句の値を返します。SELECT、WHERE、ORDER BY 句などで使用できます。IF-THEN-ELSE のように動作します。 |