aliyun-sql プラグインは、以下のクエリタイプをサポートしています:基本クエリ、カーソルによるページネーション付きクエリ、JSON 形式のクエリ、翻訳クエリ、特殊クエリ(ネスト型およびテキスト型のデータ)、ユーザー定義関数 (UDF)、および一連のビルトイン関数と式です。
クエリをインタラクティブにテストするには、Kibana コンソールをご利用ください。設定手順については、「使用方法」をご参照ください。
基本概念
クエリを作成する前に、SQL の知識を Elasticsearch の用語にマッピングします:
| SQL | Elasticsearch |
|---|---|
| テーブル | インデックス |
| 行 | ドキュメント |
| 列 | フィールド |
このプラグインは Apache Calcite を基盤としており、実行時に SQL ステートメントを Elasticsearch のドメイン特化言語 (DSL) クエリに変換します。
基本クエリ
すべての基本クエリでは、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
}パラメーター化されたクエリ
params を使用して、型付き値をクエリに渡します。これは JDBC の PreparedStatement インターフェイスと同様の動作です:
POST /_alisql?pretty
{
"query": "select * from monitor where host= ? ",
"params": [{"type":"STRING","value":"100.80.xx.xx"}],
"fetch_size": 1
}リクエストパラメーター
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
pretty | URL パラメーター | いいえ | 応答を読みやすくフォーマットします。 |
query | 文字列 | はい | 実行する SQL ステートメントです。例:select * from monitor where host='100.80.xx.xx' limit 5 |
fetch_size | 整数 | いいえ | 応答ごとに返す結果の数です。デフォルト値:1000。最大値:10000。値が 10000 を超える場合、システムは 10000 を使用します。 |
params | 配列 | いいえ | パラメーター化されたクエリの型付きパラメーター値です。例:[{"type":"STRING","value":"100.80.xx.xx"}] |
limit と fetch_size の違い:両方とも結果を制限しますが、動作は異なります:
limit:結果の総数を制限し、完全一致または範囲指定のクエリをサポートします。fetch_size:カーソルベースのページネーションにおけるページサイズを制御します。これは Scroll API と同様の動作です。
応答フィールド
典型的な応答例:
{
"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 | 2 次元配列 | クエリ結果です。各内側の配列は 1 つの一致するドキュメントに対応します。 |
cursor | 文字列 | 次のページの結果を取得するためのカーソルトークンです。さらに結果が存在する場合にのみ含まれます。 |
デフォルトでは、最大 1,000 件の結果が返されます。より大規模な結果セットの場合には、カーソルベースのページネーションを使用してすべてのデータを取得してください。
ページネーション付きクエリ
大規模な結果セットに対しては、カーソルベースのページネーションをご利用ください。
ステップ 1 — fetch_size を指定した初期リクエスト:
POST /_alisql?pretty
{
"query": "select * from monitor",
"fetch_size": 3
}応答には、さらにデータが利用可能な場合に cursor トークンが含まれます。
ステップ 2 — カーソルを用いた継続処理:
前の応答から得られた cursor 値を指定して、次のページの結果を取得します:
POST /_alisql?pretty
{
"cursor": "u5HzAgJzY0BEWEYxWlhKNVFXNWtS****"
}カーソルクエリの応答では、ネットワーク遅延を低減するため、columns フィールドは省略されます。その他のフィールドは、初期応答と同じ構造で返されます。
ステップ 3 — 終了条件:
応答に cursor フィールドが含まれていないか、または rows が空になるまで、カーソルリクエストを繰り返します。この時点で、すべてのデータが取得済みとなります。
カーソルリクエストのパラメーター
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
pretty | URL パラメーター | いいえ | 応答を読みやすくフォーマットします。 |
cursor | 文字列 | はい | 前の応答から得られたカーソルトークンです。 |
JSON 形式のクエリ
format=org を追加すると、ネイティブな Elasticsearch DSL クエリと同じ JSON 形式で結果が返されます。JOIN 文はサポートされていません。
POST /_alisql?format=org
{
"query": "select * from monitor where host= ? ",
"params": [{"type":"STRING","value":"100.80.xx.xx"}],
"fetch_size": 1
}応答は標準的な Elasticsearch hits 構造を使用します:
{
"_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"
}
}
]
}
}この形式で作業する際には、ページネーションクエリには _scroll_id フィールドをご利用ください。その他のリクエストパラメーターは、基本クエリと同一です。
クエリの翻訳
translate API は、SQL ステートメントを同等の Elasticsearch DSL クエリに変換します。クエリのデバッグや、プラグインが SQL 条件を DSL フィルターにどのようにマッピングしているかを理解する際にご利用ください。JOIN 文はサポートされていません。
POST _alisql/translate
{
"query": "select * from monitor where host= '100.80.xx.xx' "
}応答は、SQL クエリに対応する DSL です:
{
"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 プラグインは、標準 SQL データベースでは直接クエリできないネスト型およびテキスト型のデータフィールドのクエリをサポートしています。
ステップ 1 — ネスト型およびテキスト型フィールドを含むインデックスの作成:
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"}
}
}
}
}
}
}ステップ 2 — バルク挿入によるドキュメント登録:
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"}}ステップ 3 — ネスト型フィールドのクエリ:
ドット表記を使用してネスト型フィールドを参照します:
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"]
]
}ステップ 4 — テキストフィールドのクエリ:
キーワード一致を使用してテキスト型フィールドをフィルターします:
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"]
]
}ビルトイン関数および式
数値関数
| 関数 | シグネチャー | 例 | 説明 |
|---|---|---|---|
| ABS | ABS(数値) → 数値 | SELECT ABS(num_field) FROM table | 絶対値を返します。 |
| ACOS | ACOS(数値) → double | SELECT ACOS(num_field) FROM table | 逆余弦を返します。 |
| ASIN | ASIN(数値) → double | SELECT ASIN(num_field) FROM table | 逆正弦を返します。 |
| ATAN | ATAN(数値) → double | SELECT ATAN(num_field) FROM table | 逆正接を返します。 |
| ATAN2 | ATAN2(数値, 数値) → double | SELECT ATAN2(num_field1,num_field2) FROM table | 2 つの数値の逆正接を返します。 |
| CBRT | CBRT(数値) → double | SELECT CBRT(num_field) FROM table | 倍精度の立方根を返します。 |
| CEIL | CEIL(数値) → 整数 | SELECT CEIL(num_field) FROM table | 入力値以上で最小の整数を返します。 |
| COS | COS(数値) → double | SELECT COS(num_field) FROM table | 余弦を返します。 |
| COT | COT(数値) → double | SELECT COT(num_field) FROM table | 余接を返します。 |
| DEGREES | DEGREES(数値) → double | SELECT DEGREES(num_field) FROM table | ラジアンを度に変換します。 |
| EXP または EXPM1 | EXP(数値) → double | SELECT EXP(num_field) FROM table | 入力値を指数とした e のべき乗を返します。 |
| FLOOR | FLOOR(数値) → 整数 | SELECT FLOOR(num_field) FROM table | 入力値以下で最大の整数を返します。 |
| LN | LN(数値) → double | SELECT LN(num_field) FROM table | 自然対数を返します。 |
| LOG10 | LOG10(数値) → double | SELECT LOG10(num_field) FROM table | 常用対数を返します。 |
| PI | PI() → double | SELECT PI() FROM table | 円周率 π の値を返します。 |
| POWER | POWER(数値, 数値) → double | SELECT POWER(num_field,2) FROM table | 数値を指定した累乗にした結果を返します。 |
| RADIANS | RADIANS(数値) → double | SELECT RADIANS(num_field) FROM table | 度をラジアンに変換します。 |
| RAND | RAND() → double | SELECT RAND() FROM table | 範囲 [0.0, 1.0) 内のランダムな double 値を返します。 |
| ROUND | ROUND(数値, 整数) → 数値 | SELECT ROUND(num_field,2) FROM table | 指定した小数点以下の桁数に丸めます。 |
| SIN | SIN(数値) → double | SELECT SIN(num_field) FROM table | 正弦を返します。 |
| SINH | SINH(数値) → double | SELECT SINH(num_field) FROM table | 双曲線正弦を返します。 |
| SQRT | SQRT(数値) → double | SELECT SQRT(num_field) FROM table | 正の平方根を返します。 |
| TAN | TAN(数値) → double | SELECT TAN(num_field) FROM table | 正接を返します。 |
| TRUNCATE | TRUNCATE(数値, 整数) → 数値 | SELECT TRUNCATE(num_field,2) FROM table | 指定した小数点以下の桁数に切り捨てます。 |
文字列関数
| 関数 | シグネチャー | 例 | 説明 |
|---|---|---|---|
| ASCII | ASCII(文字列) → 整数 | SELECT ASCII(str_field) FROM table | 先頭文字の ASCII 値を返します。 |
| CHAR_LENGTH または CHARACTER_LENGTH | CHAR_LENGTH(文字列) → 整数 | SELECT CHAR_LENGTH(str_field) FROM table | 文字列の長さ(バイト単位)を返します。 |
| CONCAT | CONCAT(文字列, ...) → 文字列 | SELECT CONCAT(str_field,'test') FROM table | 2 つ以上の文字列を連結します。 |
| LCASE または LOWER | LCASE(文字列) → 文字列 | SELECT LCASE(str_field) FROM table | 文字列を小文字に変換します。 |
| LEFT | LEFT(文字列, 整数) → 文字列 | SELECT LEFT(str_field, 3) FROM table | 指定した数の左端の文字を返します。 |
| LPAD | LPAD(文字列, 整数, 文字列) → 文字列 | SELECT LPAD(str_field, 20, 'ABC') FROM table | 文字列を指定した長さになるよう、指定した文字列で左側を埋めます。 |
| POSITION | POSITION(文字列 IN 文字列) → 整数 | SELECT POSITION('test' IN str_field) FROM table | 部分文字列の最初の出現位置を返します。 |
| REPEAT | REPEAT(文字列, 整数) → 文字列 | SELECT REPEAT(str_field, 3) FROM table | 文字列を指定した回数だけ繰り返します。 |
| REPLACE | REPLACE(文字列, 文字列, 文字列) → 文字列 | SELECT REPLACE(str_field, 'SQL', 'HTML') FROM table | 部分文字列を新しい部分文字列に置き換えます。 |
| REVERSE | REVERSE(文字列) → 文字列 | SELECT REVERSE(str_test) FROM table | 文字列を反転します。 |
| RIGHT | RIGHT(文字列, 整数) → 文字列 | SELECT RIGHT(str_field, 3) FROM table | 指定した数の右端の文字を返します。 |
| SPACE | SPACE(整数) → 文字列 | SELECT SPACE(num_field) FROM table | 指定した数の空白文字を含む文字列を返します。 |
| SUBSTRING | SUBSTRING(文字列, 整数, 整数) → 文字列 | SELECT SUBSTRING(str_field, 5, 3) FROM table | 指定した位置から始まる部分文字列を抽出します。 |
| TRIM | TRIM(文字列) → 文字列 | SELECT TRIM(str_field) FROM table | 先頭および末尾の空白を削除します。 |
| UCASE または UPPER | UCASE(文字列) → 文字列 | SELECT UCASE(str_field) FROM table | 文字列を大文字に変換します。 |
日付関数
| 関数 | シグネチャー | 例 | 説明 |
|---|---|---|---|
| CURRENT_DATE | CURRENT_DATE() → 日付 | SELECT CURRENT_DATE() FROM table | 現在の日付を返します。 |
| CURRENT_TIME | CURRENT_TIME() → 時間 | SELECT CURRENT_TIME() FROM table | 現在の時刻を返します。 |
| CURRENT_TIMESTAMP | CURRENT_TIMESTAMP() → タイムスタンプ | SELECT CURRENT_TIMESTAMP() FROM table | 現在の日付と時刻を返します。 |
| DATE_FORMAT | DATE_FORMAT(日付, 文字列) → 文字列 | SELECT DATE_FORMAT(date_field,'yyyy') FROM date_test | 指定したパターンで日付または時刻をフォーマットします。 |
| DAYNAME | DAYNAME(日付) → 文字列 | SELECT DAYNAME(date_field) FROM table | 曜日の名称を返します。 |
| DAYOFMONTH | DAYOFMONTH(日付) → 整数 | SELECT DAYOFMONTH(date_field) FROM table | 月の日付 (1–31) を返します。 |
| DAYOFWEEK | DAYOFWEEK(日付) → 整数 | SELECT DAYOFWEEK(date_field) FROM table | 曜日のインデックスを返します。 |
| DAYOFYEAR | DAYOFYEAR(日付) → 整数 | SELECT DAYOFYEAR(date_field) FROM table | 年の日付 (1–366) を返します。 |
| EXTRACT | EXTRACT(部分 FROM 日付) → 整数 | SELECT EXTRACT(MONTH FROM date_field) FROM table | 日付または時刻から指定した部分(年、月、日、時、分)を抽出します。 |
| HOUR | HOUR(日付) → 整数 | SELECT HOUR(date_field) FROM table | 時刻の「時」の部分を返します。 |
| LAST_DAY | LAST_DAY(日付) → 日付 | SELECT LAST_DAY(date_field) FROM table | 当月の最終日を返します。 |
| MINUTE | MINUTE(時間) → 整数 | SELECT MINUTE(date_field) FROM table | 時刻の「分」の部分を返します。 |
| MONTH | MONTH(日付) → 整数 | SELECT MONTH(date_field) FROM table | 月 (1–12) を返します。 |
| MONTHNAME | MONTHNAME(日付) → 文字列 | SELECT MONTHNAME(date_field) FROM table | 月の名称を返します。 |
| QUARTER | QUARTER(日付) → 整数 | SELECT QUARTER(date_field) FROM table | 四半期 (1–4) を返します。 |
| SECOND | SECOND(時間) → 整数 | SELECT SECOND(date_field) FROM table | 2番目の部分を返します。 |
| WEEK | WEEK(日付) → 整数 | SELECT WEEK(date_field) FROM table | 週のインデックスを返します。有効な値:1–54(MySQL の 0–53 とは異なります)。 |
| YEAR | YEAR(日付) → 整数 | SELECT YEAR(date_field) FROM table | 年を返します。 |
集計関数
| 関数 | シグネチャー | 例 | 説明 |
|---|---|---|---|
| AVG | AVG(数値) → double | SELECT AVG(num_field) FROM table | 値の平均を返します。 |
| COUNT | COUNT(フィールド) → 整数 | SELECT COUNT(num_field) FROM table | 一致するレコード数を返します。 |
| MAX | MAX(T) → T | SELECT MAX(num_field) FROM table | 最大値を返します。 |
| MIN | MIN(T) → T | SELECT MIN(num_field) FROM table | 最小値を返します。 |
| SUM | SUM(数値) → 数値 | SELECT SUM(num_field) FROM table | 値の合計を返します。 |
算術演算
| 演算子 | 例 | 説明 |
|---|---|---|
+ | SELECT (v1 + v2) as v FROM table | 加算。 |
- | SELECT (v1 - v2) as v FROM table | 減算。 |
* | SELECT (v1 * v2) as v FROM table | 乗算。 |
/ | SELECT (v1 / v2) as v FROM table | 部門。 |
% | SELECT (v1 % v2) as v FROM table | 剰余(モジュロ)。 |
論理演算子
| 演算子 | 例 | 説明 |
|---|---|---|
AND | SELECT * FROM table WHERE 条件 AND 条件 | 両方の条件が真である必要があります。 |
OR | SELECT * FROM table WHERE 条件 OR 条件 | 少なくとも 1 つの条件が真である必要があります。 |
NOT | SELECT * FROM table WHERE NOT 条件 | 条件を否定します。 |
IS NULL | SELECT * FROM table WHERE フィールド IS NULL | フィールドが null であるドキュメントに一致します。 |
IS NOT NULL | SELECT * FROM table WHERE フィールド IS NOT NULL | フィールドが null でないドキュメントに一致します。 |
高度な関数
| 関数 | 構文 | 例 | 説明 |
|---|---|---|---|
| CASE | CASE WHEN 条件 THEN 値 ELSE 値 END | SELECT * FROM table ORDER BY (CASE WHEN exp1 THEN exp2 ELSE exp3 END) | exp2 を返します(exp1 が真の場合)。それ以外の場合は exp3 を返します。これは IF-THEN-ELSE 文と同等です。 |