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

Elasticsearch:クエリ構文

最終更新日:Jan 11, 2025

このトピックでは、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 と見なします。
    説明 limitfetch_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プラグインを使用すると、ネスト型とテキスト型のフィールドに基づいてデータをクエリできます。

  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は、aliyun-sqlプラグインの初期化中にのみ追加できます。次の操作は、date_format UDFを追加する方法を示しています。

  1. 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でフォーマットした文字列を返す
        }
    
    }
  2. DateFormat クラスをプラグインの初期化メソッドに追加します。
    udfTable.add(KeplerSqlUserDefinedScalarFunction // udfTableにKeplerSqlUserDefinedScalarFunctionを追加
                    .create("date_format" // 関数名は"date_format"
                            , DateFormat.class // DateFormatクラスを使用
                            , (JavaTypeFactoryImpl) typeFactory)); // typeFactoryを使用してJavaTypeFactoryImplオブジェクトを作成
  3. date_format UDFを使用してデータをクエリします。
    select date_format(date_f,'yyyy') from date_test

その他の関数と式

種類名前説明
数値関数ABSSELECT ABS(num_field) FROM table数値の絶対値を返します。
ACOSSELECT ACOS(num_field) FROM table数値のアークコサインを返します。
ASINSELECT ASIN(num_field) FROM table数値のアークサインを返します。
ATANSELECT ATAN(num_field) FROM table数値のアークタンジェントを返します。
ATAN2SELECT ATAN2(num_field1,num_field2) FROM table2つの数値のアークタンジェントを返します。
CEILSELECT CEIL(num_field) FROM table数値以上の最小の整数を返します。
CBRTSELECT CBRT(num_field) FROM table数値の倍精度立方根を返します。
COSSELECT COS(num_field) FROM table数値のコサインを返します。
COTSELECT COT(num_field) FROM table数値のコタンジェントを返します。
DEGREESSELECT DEGREES(num_field) FROM tableラジアンを度に変換します。
EXP または EXPM1SELECT EXP(num_field) FROM tableeのnum_field乗の値を返します。
FLOORSELECT FLOOR(num_field) FROM table数値以下の最大の整数を返します。
SINSELECT SIN(num_field) FROM table数値のサインを返します。
SINHSELECT SINH(num_field) FROM table数値の双曲線サインを返します。
SQRTSELECT SQRT(num_field) FROM table数値の正の平方根を返します。
TANSELECT TAN(num_field) FROM table数値のタンジェントを返します。
ROUNDSELECT ROUND(num_field,2) FROM table数値を特定の小数点以下桁数に丸めます。
RADIANSSELECT RADIANS (num_field) FROM table度単位の角度をラジアン単位の角度に変換します。
RANDSELECT RAND() FROM tableプラス記号を含む倍精度浮動小数点数を返します。数値は 0.0 以上 1.0 未満である必要があります。
LNSELECT LN (num_field) FROM table数値の自然対数を返します。
LOG10SELECT LOG10 (num_field) FROM table数値の10を底とする対数を返します。
PISELECT PI() FROM table円周率の値を返します。
POWERSELECT POWER (num_field,2) FROM table数値のべき乗の結果を返します。
TRUNCATESELECT TRUNCATE (num_field,2) FROM table数値を特定の小数点以下桁数に切り捨てます。
算術演算子+SELECT (v1 + v2) as v FROM table2つの数値の和を返します。
-SELECT(v1 - v2) as v FROM table2つの数値の差を返します。
*SELECT(v1 * v2) as v FROM table2つの数値の積を返します。
/SELECT(v1 / v2) as v FROM tableある数値を別の数値で割った商を返します。
%SELECT(v1 % v2) as v FROM tableある数値を別の数値で割った剰余を返します。
論理演算子ANDSELECT * FROM table WHERE condition AND condition2つの条件にAND演算を実行したクエリのデータを返します。
ORSELECT * FROM table WHERE condition OR condition2つの条件にOR演算を実行したクエリのデータを返します。
NOTSELECT * FROM table WHERE NOT condition条件を除外したクエリのデータを返します。
IS NULLSELECT * FROM table WHERE field IS NULL特定のフィールドの値がNULLであるクエリのデータを返します。
IS NOT NULLSELECT * FROM table WHERE field IS NOT NULL特定のフィールドの値がNULLでないクエリのデータを返します。
文字列関数ASCIISELECT ASCII(str_field) FROM table文字のASCII値を返します。
LCASE または LOWERSELECT LCASE(str_field) FROM table文字列を小文字に変換します。
UCASE または UPPERSELECT UCASE(str_field) FROM table文字列を大文字に変換します。
CHAR_LENGTH または CHARACTER_LENGTHSELECT CHAR_LENGTH(str_field) FROM table文字列の長さをバイト単位で返します。
TRIMSELECT TRIM(str_field) FROM table先頭と末尾のスペースを削除して文字列をトリミングします。
SPACESELECT SPACE(num_field) FROM table指定された数のスペースを含む文字列を返します。
LEFTSELECT LEFT(str_field, 3) FROM table文字列の左端から指定された数の文字を返します。
RIGHTSELECT RIGHT(str_field, 3) FROM table文字列の右端から指定された数の文字を返します。
REPEATSELECT REPEAT(str_field, 3) FROM table文字列を指定された回数繰り返して、結果の文字列を返します。
REPLACESELECT REPLACE(str_field, "SQL", "HTML") FROM table文字列内の部分文字列を新しい部分文字列に置き換えます。
POSITIONSELECT POSITION("test" IN str_field) FROM table文字列内で部分文字列が最初に出現する位置を返します。
REVERSESELECT REVERSE(str_test) from table文字列を反転し、結果の文字列を返します。
LPADSELECT LPAD(str_field, 20, "ABC") FROM table指定された長さに基づいて、指定された文字を文字列の先頭に追加します。
CONCATSELECT CONCAT(str_field,'test') FROM table複数の文字列を連結し、結果の文字列を返します。
SUBSTRINGSELECT SUBSTRING(str_field, 5, 3) FROM table指定された文字位置に基づいて文字列から抽出された部分文字列を返します。
日付関数CURRENT_DATESELECT CURRENT_DATE() FROM table現在の日付を返します。
CURRENT_TIMESELECT CURRENT_TIME() FROM table現在の時刻を返します。
CURRENT_TIMESTAMPSELECT CURRENT_TIMESTAMP() FROM table現在の日付と時刻を返します。
DAYNAMESELECT DAYNAME(date_field) FROM table日付の曜日を返します。
DAYOFMONTHSELECT DAYOFMONTH(date_field) FROM table日付の月のインデックスを返します。
DAYOFYEARSELECT DAYOFYEAR(date_field) FROM table日付の年のインデックスを返します。
DAYOFWEEKSELECT DAYOFWEEK(date_field) FROM table日付の曜日のインデックスを返します。
HOURSELECT HOUR(date_field) FROM table日付の時間の部分を返します。
MINUTESELECT MINUTE(date_field) FROM table時刻または日時の分の部分を返します。
SECONDSELECT SECOND(date_field) FROM table時刻または日時の秒の部分を返します。
YEARSELECT YEAR(date_field) FROM table日付の年の部分を返します。
MONTHSELECT MONTH(date_field) FROM table日付の月の部分を返します。
WEEKSELECT WEEK(date_field) FROM table日付が含まれる週のインデックスを返します。aliyun-sqlプラグインの有効な値:1~54。MySQLの有効な値:0~53。
MONTHNAMESELECT MONTHNAME(date_field) FROM table日付の月の名前を返します。
LAST_DAYSELECT LAST_DAY(date_field) FROM table日付の月の最終日を返します。
QUARTERSELECT QUARTER(date_field) FROM table日付の四半期を返します。
EXTRACTSELECT EXTRACT(MONTH FROM date_field) FROM table日付または時刻の1つ以上の個別の部分を返します。たとえば、この関数は、日付または時刻の年、月、日、時、または分の部分を返すことができます。
DATE_FORMATSELECT DATE_FORMAT(date_field,'yyyy') from date_test日付または時刻をフォーマットします。
集計関数MINSELECT MIN(num_field) FROM table値のセットの中で最小値を返します。
MAXSELECT MAX(num_field) FROM table値のセットの中で最大値を返します。
AVGSELECT AVG(num_field) FROM table値のセットの平均を返します。
SUMSELECT SUM(num_field) FROM table値のセットの合計を返します。
COUNTSELECT COUNT(num_field) FROM table指定された条件を満たすレコードの数を返します。
高度な関数CASESELECT * FROM table ORDER BY(CASE WHEN exp1 THEN exp2 ELSE exp3 END)構文はCASE WHEN THEN ELSE ENDです。WHEN句で指定された条件が満たされた場合、THEN句で指定された値が返されます。条件が満たされない場合、ELSE句で指定された値が返されます。CASEステートメントの構文は、IF THEN ELSEステートメントの構文に似ています。