すべてのプロダクト
Search
ドキュメントセンター

Elasticsearch:aliyun-sql プラグインによるデータクエリ (新規顧客向けサービス終了)

最終更新日:Aug 20, 2026

前提条件

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 を使用してデータを書き込むことができます。

  1. ご使用の Alibaba Cloud Elasticsearch インスタンス の Kibana コンソール にログインします。

    Kibana コンソール へのログイン方法の詳細については、「Kibana を使用したクラスターへの接続」をご参照ください。

  2. 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"}
  3. 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

はい

select * from monitor where host='100.80.xx.xx' limit 5

SQL クエリステートメント。

リクエストボディパラメーター

fetch_size

いいえ

3

クエリごとに返す行数。デフォルト:1000。最大:10000。10000 を超える値を設定した場合、システムは 10000 を使用します。limit 句は、フルクエリまたは範囲クエリをサポートします。fetch_size は スクロールクエリ のように機能します。

リクエストボディパラメーター

params

いいえ

[{"type":"STRING","value":"100.80.xx.xx"}]

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 プラグインは、ネストされたフィールドとテキストフィールドのクエリをサポートしています。

  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. ネストされた型の 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"
        ]
      ]
    }
  4. テキスト型の 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 メソッドを拡張する方法を示します。

  1. 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);
        }
    
    }
  2. DateFormat クラスをプラグインの初期化メソッドに追加します。

    udfTable.add(KeplerSqlUserDefinedScalarFunction
                    .create("date_format"
                            , DateFormat.class
                            , (JavaTypeFactoryImpl) typeFactory));
  3. クエリで 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

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 を指定の数値でべき乗した値を返します。

数値関数

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

数値の常用対数を返します。

数値関数

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

2つの数値の商を返します。

算術演算子

%

SELECT (v1 % v2) as v FROM table

除算後の剰余を返します。

論理演算子

AND

SELECT * FROM table WHERE condition AND condition

両方の条件を満たすデータを返します。

論理演算子

OR

SELECT * FROM table WHERE condition OR condition

いずれかの条件を満たすデータを返します。

論理演算子

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

2つ以上の式を結合して返します。

文字列関数

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

日付の日 (1~31) を返します。

日付関数

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

時刻または datetime の時刻部分 (分) を返します。

日付関数

SECOND

SELECT SECOND(date_field) FROM table

時刻または datetime の時刻部分 (秒) を返します。

日付関数

YEAR

SELECT YEAR(date_field) FROM table

日付の年部分を返します。

日付関数

MONTH

SELECT MONTH(date_field) FROM table

日付の月部分を返します。

日付関数

WEEK

SELECT WEEK(date_field) FROM table

日付に対応する週番号 (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

年、月、日、時、分など、日付または時刻の特定部分を返します。

日付関数

DATE_FORMAT

SELECT DATE_FORMAT(date_field,'yyyy') FROM table

日付または時刻をフォーマットして返します。

集約関数

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)

WHEN 句の条件が満たされた場合に THEN 句の値を、それ以外の場合は ELSE 句の値を返します。SELECT、WHERE、ORDER BY 句などで使用できます。IF-THEN-ELSE のように動作します。