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

Elasticsearch:クエリ構文

最終更新日:Mar 26, 2026

aliyun-sql プラグインは、以下のクエリタイプをサポートしています:基本クエリ、カーソルによるページネーション付きクエリ、JSON 形式のクエリ、翻訳クエリ、特殊クエリ(ネスト型およびテキスト型のデータ)、ユーザー定義関数 (UDF)、および一連のビルトイン関数と式です。

クエリをインタラクティブにテストするには、Kibana コンソールをご利用ください。設定手順については、「使用方法」をご参照ください。

基本概念

クエリを作成する前に、SQL の知識を Elasticsearch の用語にマッピングします:

SQLElasticsearch
テーブルインデックス
ドキュメント
フィールド

このプラグインは 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
}

リクエストパラメーター

パラメーター必須説明
prettyURL パラメーターいいえ応答を読みやすくフォーマットします。
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配列クエリ対象のフィールドの名前とデータの型です。
rows2 次元配列クエリ結果です。各内側の配列は 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 が空になるまで、カーソルリクエストを繰り返します。この時点で、すべてのデータが取得済みとなります。

カーソルリクエストのパラメーター

パラメーター必須説明
prettyURL パラメーターいいえ応答を読みやすくフォーマットします。
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"]
  ]
}

ビルトイン関数および式

数値関数

関数シグネチャー説明
ABSABS(数値) → 数値SELECT ABS(num_field) FROM table絶対値を返します。
ACOSACOS(数値) → doubleSELECT ACOS(num_field) FROM table逆余弦を返します。
ASINASIN(数値) → doubleSELECT ASIN(num_field) FROM table逆正弦を返します。
ATANATAN(数値) → doubleSELECT ATAN(num_field) FROM table逆正接を返します。
ATAN2ATAN2(数値, 数値) → doubleSELECT ATAN2(num_field1,num_field2) FROM table2 つの数値の逆正接を返します。
CBRTCBRT(数値) → doubleSELECT CBRT(num_field) FROM table倍精度の立方根を返します。
CEILCEIL(数値) → 整数SELECT CEIL(num_field) FROM table入力値以上で最小の整数を返します。
COSCOS(数値) → doubleSELECT COS(num_field) FROM table余弦を返します。
COTCOT(数値) → doubleSELECT COT(num_field) FROM table余接を返します。
DEGREESDEGREES(数値) → doubleSELECT DEGREES(num_field) FROM tableラジアンを度に変換します。
EXP または EXPM1EXP(数値) → doubleSELECT EXP(num_field) FROM table入力値を指数とした e のべき乗を返します。
FLOORFLOOR(数値) → 整数SELECT FLOOR(num_field) FROM table入力値以下で最大の整数を返します。
LNLN(数値) → doubleSELECT LN(num_field) FROM table自然対数を返します。
LOG10LOG10(数値) → doubleSELECT LOG10(num_field) FROM table常用対数を返します。
PIPI() → doubleSELECT PI() FROM table円周率 π の値を返します。
POWERPOWER(数値, 数値) → doubleSELECT POWER(num_field,2) FROM table数値を指定した累乗にした結果を返します。
RADIANSRADIANS(数値) → doubleSELECT RADIANS(num_field) FROM table度をラジアンに変換します。
RANDRAND() → doubleSELECT RAND() FROM table範囲 [0.0, 1.0) 内のランダムな double 値を返します。
ROUNDROUND(数値, 整数) → 数値SELECT ROUND(num_field,2) FROM table指定した小数点以下の桁数に丸めます。
SINSIN(数値) → doubleSELECT SIN(num_field) FROM table正弦を返します。
SINHSINH(数値) → doubleSELECT SINH(num_field) FROM table双曲線正弦を返します。
SQRTSQRT(数値) → doubleSELECT SQRT(num_field) FROM table正の平方根を返します。
TANTAN(数値) → doubleSELECT TAN(num_field) FROM table正接を返します。
TRUNCATETRUNCATE(数値, 整数) → 数値SELECT TRUNCATE(num_field,2) FROM table指定した小数点以下の桁数に切り捨てます。

文字列関数

関数シグネチャー説明
ASCIIASCII(文字列) → 整数SELECT ASCII(str_field) FROM table先頭文字の ASCII 値を返します。
CHAR_LENGTH または CHARACTER_LENGTHCHAR_LENGTH(文字列) → 整数SELECT CHAR_LENGTH(str_field) FROM table文字列の長さ(バイト単位)を返します。
CONCATCONCAT(文字列, ...) → 文字列SELECT CONCAT(str_field,'test') FROM table2 つ以上の文字列を連結します。
LCASE または LOWERLCASE(文字列) → 文字列SELECT LCASE(str_field) FROM table文字列を小文字に変換します。
LEFTLEFT(文字列, 整数) → 文字列SELECT LEFT(str_field, 3) FROM table指定した数の左端の文字を返します。
LPADLPAD(文字列, 整数, 文字列) → 文字列SELECT LPAD(str_field, 20, 'ABC') FROM table文字列を指定した長さになるよう、指定した文字列で左側を埋めます。
POSITIONPOSITION(文字列 IN 文字列) → 整数SELECT POSITION('test' IN str_field) FROM table部分文字列の最初の出現位置を返します。
REPEATREPEAT(文字列, 整数) → 文字列SELECT REPEAT(str_field, 3) FROM table文字列を指定した回数だけ繰り返します。
REPLACEREPLACE(文字列, 文字列, 文字列) → 文字列SELECT REPLACE(str_field, 'SQL', 'HTML') FROM table部分文字列を新しい部分文字列に置き換えます。
REVERSEREVERSE(文字列) → 文字列SELECT REVERSE(str_test) FROM table文字列を反転します。
RIGHTRIGHT(文字列, 整数) → 文字列SELECT RIGHT(str_field, 3) FROM table指定した数の右端の文字を返します。
SPACESPACE(整数) → 文字列SELECT SPACE(num_field) FROM table指定した数の空白文字を含む文字列を返します。
SUBSTRINGSUBSTRING(文字列, 整数, 整数) → 文字列SELECT SUBSTRING(str_field, 5, 3) FROM table指定した位置から始まる部分文字列を抽出します。
TRIMTRIM(文字列) → 文字列SELECT TRIM(str_field) FROM table先頭および末尾の空白を削除します。
UCASE または UPPERUCASE(文字列) → 文字列SELECT UCASE(str_field) FROM table文字列を大文字に変換します。

日付関数

関数シグネチャー説明
CURRENT_DATECURRENT_DATE() → 日付SELECT CURRENT_DATE() FROM table現在の日付を返します。
CURRENT_TIMECURRENT_TIME() → 時間SELECT CURRENT_TIME() FROM table現在の時刻を返します。
CURRENT_TIMESTAMPCURRENT_TIMESTAMP() → タイムスタンプSELECT CURRENT_TIMESTAMP() FROM table現在の日付と時刻を返します。
DATE_FORMATDATE_FORMAT(日付, 文字列) → 文字列SELECT DATE_FORMAT(date_field,'yyyy') FROM date_test指定したパターンで日付または時刻をフォーマットします。
DAYNAMEDAYNAME(日付) → 文字列SELECT DAYNAME(date_field) FROM table曜日の名称を返します。
DAYOFMONTHDAYOFMONTH(日付) → 整数SELECT DAYOFMONTH(date_field) FROM table月の日付 (1–31) を返します。
DAYOFWEEKDAYOFWEEK(日付) → 整数SELECT DAYOFWEEK(date_field) FROM table曜日のインデックスを返します。
DAYOFYEARDAYOFYEAR(日付) → 整数SELECT DAYOFYEAR(date_field) FROM table年の日付 (1–366) を返します。
EXTRACTEXTRACT(部分 FROM 日付) → 整数SELECT EXTRACT(MONTH FROM date_field) FROM table日付または時刻から指定した部分(年、月、日、時、分)を抽出します。
HOURHOUR(日付) → 整数SELECT HOUR(date_field) FROM table時刻の「時」の部分を返します。
LAST_DAYLAST_DAY(日付) → 日付SELECT LAST_DAY(date_field) FROM table当月の最終日を返します。
MINUTEMINUTE(時間) → 整数SELECT MINUTE(date_field) FROM table時刻の「分」の部分を返します。
MONTHMONTH(日付) → 整数SELECT MONTH(date_field) FROM table月 (1–12) を返します。
MONTHNAMEMONTHNAME(日付) → 文字列SELECT MONTHNAME(date_field) FROM table月の名称を返します。
QUARTERQUARTER(日付) → 整数SELECT QUARTER(date_field) FROM table四半期 (1–4) を返します。
SECONDSECOND(時間) → 整数SELECT SECOND(date_field) FROM table2番目の部分を返します。
WEEKWEEK(日付) → 整数SELECT WEEK(date_field) FROM table週のインデックスを返します。有効な値:1–54(MySQL の 0–53 とは異なります)。
YEARYEAR(日付) → 整数SELECT YEAR(date_field) FROM table年を返します。

集計関数

関数シグネチャー説明
AVGAVG(数値) → doubleSELECT AVG(num_field) FROM table値の平均を返します。
COUNTCOUNT(フィールド) → 整数SELECT COUNT(num_field) FROM table一致するレコード数を返します。
MAXMAX(T) → TSELECT MAX(num_field) FROM table最大値を返します。
MINMIN(T) → TSELECT MIN(num_field) FROM table最小値を返します。
SUMSUM(数値) → 数値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剰余(モジュロ)。

論理演算子

演算子説明
ANDSELECT * FROM table WHERE 条件 AND 条件両方の条件が真である必要があります。
ORSELECT * FROM table WHERE 条件 OR 条件少なくとも 1 つの条件が真である必要があります。
NOTSELECT * FROM table WHERE NOT 条件条件を否定します。
IS NULLSELECT * FROM table WHERE フィールド IS NULLフィールドが null であるドキュメントに一致します。
IS NOT NULLSELECT * FROM table WHERE フィールド IS NOT NULLフィールドが null でないドキュメントに一致します。

高度な関数

関数構文説明
CASECASE WHEN 条件 THEN 値 ELSE 値 ENDSELECT * FROM table ORDER BY (CASE WHEN exp1 THEN exp2 ELSE exp3 END)exp2 を返します(exp1 が真の場合)。それ以外の場合は exp3 を返します。これは IF-THEN-ELSE 文と同等です。