このトピックでは、aliyun-sqlプラグインのクエリ構文について説明します。このプラグインは、基本クエリ、カーソルを使用したクエリ、JSON形式のクエリ、変換クエリ、特殊クエリ、ユーザー定義関数(UDF)、その他の関数、および式をサポートしています。
説明 aliyun-sqlプラグインのクエリ構文を理解したら、Kibanaコンソールでプラグインをテストおよび使用できます。詳細については、使用方法をご参照ください。
基本クエリ
- 一般的なクエリ
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 はい select * from monitor where host='100.80.xx.xx' limit 5実行するSQLステートメントを指定します。 fetch_size いいえ 3返すデータエントリ数を指定します。デフォルト値は 1000 です。最大値は 10000 です。このパラメータを 10000 より大きい値に設定した場合でも、システムは値を 10000 と見なします。 説明 limit と fetch_size はどちらもクエリ範囲を制限できますが、以下の違いがあります。- limit: 完全クエリまたは範囲クエリをサポートします。
- fetch_size: Scroll に似ています。
params いいえ [{"type":"STRING","value":"100.80.xx.xx"}]PreparedStatementインターフェースの機能を実装します。 - クエリ結果 大量のデータを初めてクエリするためにSQLステートメントを実行すると、返すデータエントリ数は 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形式のクエリ
- クエリリクエスト(JOINステートメントはサポートされていません。)
POST /_alisql? format=org { "query": "select * from monitor where host= ? ", "params": [{"type":"STRING","value":"100.80.xx.xx"}], "fetch_size": 1 }format=orgは、クエリ結果がJSON形式であることを示します。その他のパラメータは、基本クエリのパラメータと同じです。詳細については、基本クエリをご参照ください。 - クエリ結果
{ "_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": [] } }
特殊クエリ
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は、aliyun-sqlプラグインの初期化中にのみ追加できます。次の操作は、date_format UDFを追加する方法を示しています。
DateFormatクラスを定義します。/** * DateFormat. */ public class DateFormat extends UDF { public String eval(DateTime time, String toFormat) { // DateTime型のtimeとString型のtoFormatを引数に取り、String型を返すevalメソッド if (time == null || toFormat == null) { // timeまたはtoFormatがnullの場合、nullを返す return null; } Date date = time.toDate(); // timeをDate型に変換 SimpleDateFormat format = new SimpleDateFormat(toFormat); // toFormatを使用してSimpleDateFormatオブジェクトを作成 return format.format(date); // dateをformatでフォーマットした文字列を返す } }DateFormatクラスをプラグインの初期化メソッドに追加します。udfTable.add(KeplerSqlUserDefinedScalarFunction // udfTableにKeplerSqlUserDefinedScalarFunctionを追加 .create("date_format" // 関数名は"date_format" , DateFormat.class // DateFormatクラスを使用 , (JavaTypeFactoryImpl) typeFactory)); // typeFactoryを使用してJavaTypeFactoryImplオブジェクトを作成- date_format UDFを使用してデータをクエリします。
select date_format(date_f,'yyyy') from date_test
その他の関数と式
| 種類 | 名前 | 例 | 説明 |
| 数値関数 | ABS | SELECT ABS(num_field) FROM table | 数値の絶対値を返します。 |
| ACOS | SELECT ACOS(num_field) FROM table | 数値のアークコサインを返します。 | |
| ASIN | SELECT ASIN(num_field) FROM table | 数値のアークサインを返します。 | |
| ATAN | SELECT ATAN(num_field) FROM table | 数値のアークタンジェントを返します。 | |
| ATAN2 | SELECT ATAN2(num_field1,num_field2) FROM table | 2つの数値のアークタンジェントを返します。 | |
| CEIL | SELECT CEIL(num_field) FROM table | 数値以上の最小の整数を返します。 | |
| CBRT | SELECT CBRT(num_field) FROM table | 数値の倍精度立方根を返します。 | |
| COS | SELECT COS(num_field) FROM table | 数値のコサインを返します。 | |
| COT | SELECT COT(num_field) FROM table | 数値のコタンジェントを返します。 | |
| DEGREES | SELECT DEGREES(num_field) FROM table | ラジアンを度に変換します。 | |
| EXP または EXPM1 | SELECT EXP(num_field) FROM table | eのnum_field乗の値を返します。 | |
| FLOOR | SELECT FLOOR(num_field) FROM table | 数値以下の最大の整数を返します。 | |
| SIN | SELECT SIN(num_field) FROM table | 数値のサインを返します。 | |
| SINH | SELECT SINH(num_field) FROM table | 数値の双曲線サインを返します。 | |
| SQRT | SELECT SQRT(num_field) FROM table | 数値の正の平方根を返します。 | |
| TAN | SELECT TAN(num_field) FROM table | 数値のタンジェントを返します。 | |
| ROUND | SELECT ROUND(num_field,2) FROM table | 数値を特定の小数点以下桁数に丸めます。 | |
| RADIANS | SELECT RADIANS (num_field) FROM table | 度単位の角度をラジアン単位の角度に変換します。 | |
| RAND | SELECT RAND() FROM table | プラス記号を含む倍精度浮動小数点数を返します。数値は 0.0 以上 1.0 未満である必要があります。 | |
| LN | SELECT LN (num_field) FROM table | 数値の自然対数を返します。 | |
| LOG10 | SELECT LOG10 (num_field) FROM table | 数値の10を底とする対数を返します。 | |
| PI | SELECT PI() FROM table | 円周率の値を返します。 | |
| POWER | SELECT POWER (num_field,2) FROM table | 数値のべき乗の結果を返します。 | |
| TRUNCATE | SELECT TRUNCATE (num_field,2) FROM table | 数値を特定の小数点以下桁数に切り捨てます。 | |
| 算術演算子 | + | SELECT (v1 + v2) as v FROM table | 2つの数値の和を返します。 |
| - | SELECT(v1 - v2) as v FROM table | 2つの数値の差を返します。 | |
| * | SELECT(v1 * v2) as v FROM table | 2つの数値の積を返します。 | |
| / | SELECT(v1 / v2) as v FROM table | ある数値を別の数値で割った商を返します。 | |
| % | SELECT(v1 % v2) as v FROM table | ある数値を別の数値で割った剰余を返します。 | |
| 論理演算子 | AND | SELECT * FROM table WHERE condition AND condition | 2つの条件にAND演算を実行したクエリのデータを返します。 |
| OR | SELECT * FROM table WHERE condition OR condition | 2つの条件にOR演算を実行したクエリのデータを返します。 | |
| NOT | SELECT * FROM table WHERE NOT condition | 条件を除外したクエリのデータを返します。 | |
| IS NULL | SELECT * FROM table WHERE field IS NULL | 特定のフィールドの値がNULLであるクエリのデータを返します。 | |
| IS NOT NULL | SELECT * FROM table WHERE field IS NOT NULL | 特定のフィールドの値がNULLでないクエリのデータを返します。 | |
| 文字列関数 | ASCII | SELECT ASCII(str_field) FROM table | 文字のASCII値を返します。 |
| LCASE または LOWER | SELECT LCASE(str_field) FROM table | 文字列を小文字に変換します。 | |
| UCASE または UPPER | SELECT UCASE(str_field) FROM table | 文字列を大文字に変換します。 | |
| CHAR_LENGTH または CHARACTER_LENGTH | SELECT CHAR_LENGTH(str_field) FROM table | 文字列の長さをバイト単位で返します。 | |
| TRIM | SELECT TRIM(str_field) FROM table | 先頭と末尾のスペースを削除して文字列をトリミングします。 | |
| SPACE | SELECT SPACE(num_field) FROM table | 指定された数のスペースを含む文字列を返します。 | |
| LEFT | SELECT LEFT(str_field, 3) FROM table | 文字列の左端から指定された数の文字を返します。 | |
| RIGHT | SELECT RIGHT(str_field, 3) FROM table | 文字列の右端から指定された数の文字を返します。 | |
| REPEAT | SELECT REPEAT(str_field, 3) FROM table | 文字列を指定された回数繰り返して、結果の文字列を返します。 | |
| REPLACE | SELECT REPLACE(str_field, "SQL", "HTML") FROM table | 文字列内の部分文字列を新しい部分文字列に置き換えます。 | |
| POSITION | SELECT POSITION("test" IN str_field) FROM table | 文字列内で部分文字列が最初に出現する位置を返します。 | |
| REVERSE | SELECT REVERSE(str_test) from table | 文字列を反転し、結果の文字列を返します。 | |
| LPAD | SELECT LPAD(str_field, 20, "ABC") FROM table | 指定された長さに基づいて、指定された文字を文字列の先頭に追加します。 | |
| CONCAT | SELECT CONCAT(str_field,'test') FROM table | 複数の文字列を連結し、結果の文字列を返します。 | |
| SUBSTRING | SELECT SUBSTRING(str_field, 5, 3) FROM table | 指定された文字位置に基づいて文字列から抽出された部分文字列を返します。 | |
| 日付関数 | CURRENT_DATE | SELECT CURRENT_DATE() FROM table | 現在の日付を返します。 |
| CURRENT_TIME | SELECT CURRENT_TIME() FROM table | 現在の時刻を返します。 | |
| CURRENT_TIMESTAMP | SELECT CURRENT_TIMESTAMP() FROM table | 現在の日付と時刻を返します。 | |
| DAYNAME | SELECT DAYNAME(date_field) FROM table | 日付の曜日を返します。 | |
| DAYOFMONTH | SELECT DAYOFMONTH(date_field) FROM table | 日付の月のインデックスを返します。 | |
| DAYOFYEAR | SELECT DAYOFYEAR(date_field) FROM table | 日付の年のインデックスを返します。 | |
| DAYOFWEEK | SELECT DAYOFWEEK(date_field) FROM table | 日付の曜日のインデックスを返します。 | |
| HOUR | SELECT HOUR(date_field) FROM table | 日付の時間の部分を返します。 | |
| MINUTE | SELECT MINUTE(date_field) FROM table | 時刻または日時の分の部分を返します。 | |
| SECOND | SELECT SECOND(date_field) FROM table | 時刻または日時の秒の部分を返します。 | |
| YEAR | SELECT YEAR(date_field) FROM table | 日付の年の部分を返します。 | |
| MONTH | SELECT MONTH(date_field) FROM table | 日付の月の部分を返します。 | |
| WEEK | SELECT WEEK(date_field) FROM table | 日付が含まれる週のインデックスを返します。aliyun-sqlプラグインの有効な値:1~54。MySQLの有効な値:0~53。 | |
| MONTHNAME | SELECT MONTHNAME(date_field) FROM table | 日付の月の名前を返します。 | |
| LAST_DAY | SELECT LAST_DAY(date_field) FROM table | 日付の月の最終日を返します。 | |
| QUARTER | SELECT QUARTER(date_field) FROM table | 日付の四半期を返します。 | |
| EXTRACT | SELECT EXTRACT(MONTH FROM date_field) FROM table | 日付または時刻の1つ以上の個別の部分を返します。たとえば、この関数は、日付または時刻の年、月、日、時、または分の部分を返すことができます。 | |
| DATE_FORMAT | SELECT DATE_FORMAT(date_field,'yyyy') from date_test | 日付または時刻をフォーマットします。 | |
| 集計関数 | MIN | SELECT MIN(num_field) FROM table | 値のセットの中で最小値を返します。 |
| MAX | SELECT MAX(num_field) FROM table | 値のセットの中で最大値を返します。 | |
| AVG | SELECT AVG(num_field) FROM table | 値のセットの平均を返します。 | |
| SUM | SELECT SUM(num_field) FROM table | 値のセットの合計を返します。 | |
| COUNT | SELECT COUNT(num_field) FROM table | 指定された条件を満たすレコードの数を返します。 | |
| 高度な関数 | CASE | SELECT * FROM table ORDER BY(CASE WHEN exp1 THEN exp2 ELSE exp3 END) | 構文はCASE WHEN THEN ELSE ENDです。WHEN句で指定された条件が満たされた場合、THEN句で指定された値が返されます。条件が満たされない場合、ELSE句で指定された値が返されます。CASEステートメントの構文は、IF THEN ELSEステートメントの構文に似ています。 |