全部產品
Search
文件中心

Elasticsearch:查詢文法說明

更新時間:Jun 30, 2024

本文介紹aliyun-sql外掛程式的查詢文法,包括基礎查詢、遊標查詢、JSON格式查詢、translate查詢、特殊文法、自訂UDF函數以及Function和運算式。

說明 本文僅介紹aliyun-sql外掛程式的查詢文法,瞭解了查詢文法後,您可以在Kibana控制台上進行測試和使用。具體操作方法,請參見aliyun-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將返回結果格式化顯示。
    請求體參數queryselect * from monitor where host='100.80.xx.xx' limit 5具體的SQL查詢語句。
    fetch_size3每次查詢的資料條數。預設值為1000,最大值為10000。如果超過10000,將使用預設最大值10000。
    說明 limitfetch_size都可以限制查詢範圍,但兩者的本質不同,區別在於:
    • limit:可以實現全量或範圍查詢。
    • fetch_size:類似於遊標查詢
    params[{"type":"STRING","value":"100.80.xx.xx"}]主要實作類別似PreparedStatement的功能。
  • 查詢返回結果
    對於資料量比較大的查詢,首次執行SQL查詢,返回結果中包含的資料條數為fetch_size設定的值,並且包含了遊標cursor。
    {
      "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包含nametype欄位,表示查詢欄位的名稱和類型。
    rows查詢結果。
    cursor遊標,用於下次查詢。
    重要 預設返回結果為1000條,如果返回結果大於1000條,您可以不斷地使用遊標查詢(直到無cursor返回或者返回結果為空白),擷取剩餘的所有資料。

遊標查詢

  • 查詢請求
    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(Domain Specific Language)查詢的返回結果格式相同,_scroll_id參數用來設定翻頁。

translate查詢

您可以使用translate查詢,將請求的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外掛程式支援查詢nested和text類型的欄位,具體使用方式如下。

  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. 根據nested類型的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. 根據text類型的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"
        ]
      ]
    }

Function和運算式

類型名稱樣本說明
Numeric FunctionABSSELECT 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 table返回兩個指定數位反正切值。
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 table返回e的指定數位次方冪。
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將指定數字四捨五入到指定的小數位。
RADIANS SELECT 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返回PI的值。
POWERSELECT POWER (num_field,2) FROM table返回指定數位乘冪。
TRUNCATE SELECT TRUNCATE (num_field,2) FROM table返回將指定數字截斷到指定小數位的值。
Arithmetic Operate+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返回兩個數字相除後的餘數。
Logic OperateANDSELECT * FROM table WHERE condition AND condition返回將兩種情況並運算後,查詢的資料。
ORSELECT * FROM table WHERE condition OR condition返回將兩種情況或運算後,查詢的資料。
NOTSELECT * FROM table WHERE NOT condition返回排除某種情況的查詢資料。
IS NULLSELECT * FROM table WHERE field IS NULL返回當指定欄位為空白時的查詢資料。
IS NOT NULLSELECT * FROM table WHERE field IS NOT NULL返回當指定欄位不為空白時的查詢資料。
String Function 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從字串中提取子字串(從任何位置開始)。
Date Function 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返回指定日期的星期數(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返回指定日期或時間的單獨部分,例如年、月、日、小時、分鐘等。
DATE_FORMATSELECT DATE_FORMAT(date_field,'yyyy') from date_test將日期或時間資料格式化輸出。
Aggregation FunctionMINSELECT 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返回指定條件的記錄數。
Advanced FunctionCASESELECT * 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文法類似。