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

Elasticsearch:aliyun-sql プラグインを使用したデータのクエリ (新規顧客の受け入れは終了しました)

最終更新日:Mar 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 コンソールの [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 を使用してデータを書き込むことができます。

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

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

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

基本的なクエリ

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

はい

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

名前とタイプが含まれます。各フィールドの名前とタイプを表示します。

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

  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

指定されたフィールドが空の場合にデータを返します。

論理演算子

IS NOT NULL

SELECT * FROM table WHERE field IS NOT 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

指定された日付の月を返します。

日付関数

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

時刻または日時の2番目の部分を返します。

日付関数

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 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 の値を返します。これは SELECT、WHERE、ORDER 句で使用できます。IF THEN ELSE と同様に機能します。