全部产品
Search
文档中心

Elasticsearch:Sintaksis Query

更新时间:Jun 24, 2025

Topik ini menjelaskan sintaksis query dari plug-in aliyun-sql. Plug-in ini mendukung query dasar, query dengan kursor, query berformat JSON, query terjemahan, query khusus, fungsi yang ditentukan pengguna (UDF), serta fungsi dan ekspresi lainnya.

null Setelah memahami sintaksis query dari plug-in aliyun-sql, Anda dapat menguji dan menggunakan plug-in tersebut di Konsol Kibana. Untuk informasi lebih lanjut, lihat Metode Penggunaan.

Query Dasar

  • Query umum
    POST /_alisql?pretty
    {
      "query": "select * from monitor where host='100.80.xx.xx' limit 5"
    }
  • Query dengan jumlah entri data yang telah ditentukan
    POST /_alisql?pretty
    {
        "query": "select * from monitor",
        "fetch_size": 3
    }
  • Query dengan parameter tertentu
    POST /_alisql?pretty
    {
      "query": "select * from monitor where host= ? ",
      "params": [{"type":"STRING","value":"100.80.xx.xx"}],
      "fetch_size": 1
    }
    TipeParameterDiperlukanContohDeskripsi
    Parameter URLprettyTidakTidak ada.Memformat hasil query.
    Parameter body permintaanqueryYaselect * from monitor where host='100.80.xx.xx' limit 5Menentukan pernyataan SQL yang ingin Anda jalankan.
    fetch_sizeTidak3Menentukan jumlah entri data yang akan dikembalikan. Nilai default adalah 1000. Nilai maksimum adalah 10000. Jika Anda menetapkan parameter ini ke nilai lebih dari 10000, sistem tetap menganggap nilainya sebagai 10000.
    null Kedua limit dan fetch_size dapat membatasi rentang query, namun memiliki perbedaan berikut:
    • limit: mendukung full query atau range query.
    • fetch_size: mirip dengan Scroll.
    paramsTidak[{"type":"STRING","value":"100.80.xx.xx"}]Mengimplementasikan fitur antarmuka PreparedStatement.
  • Hasil query
    Saat menjalankan pernyataan SQL untuk meminta sejumlah besar data untuk pertama kalinya, jumlah entri data yang dikembalikan ditentukan oleh parameter fetch_size. Hasil query juga mencakup kursor.
    {
      "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****"
    }
    ParameterDeskripsi
    columnsnamatipe dataNama dan tipe data dari bidang yang Anda kueri.
    rowsHasil query.
    cursorKursor yang digunakan untuk query selanjutnya.
    null Secara default, jumlah maksimum entri data yang dikembalikan adalah 1.000. Jika jumlah entri data yang diminta melebihi 1.000, Anda dapat menggunakan kursor untuk meminta entri tambahan hingga tidak ada kursor atau entri data yang tersisa.

Query dengan kursor

  • Permintaan query
    POST /_alisql? pretty
    {
        "cursor": "u5HzAgJzY0BEWEYxWlhKNVFXNWtS****"
    }
    TipeParameterDiperlukanDeskripsi
    Parameter URLprettyTidakMemformat hasil query.
    Parameter body permintaancursorYaKursor yang digunakan untuk meminta data tertentu.
  • Hasil query
    {
      "rows": [
        [
          572547,
          3.327459E7,
          "100.80.xx.xx",
          "china-dd",
          "cpu",
          "2018-08-09T08:19:12.000Z"
        ]
      ],
      "cursor": "u5HzAgJzY0BEWEYxWlhKNVFXNWtS****"
    }

    Hasil query tidak mencakup bidang columns, sehingga mengurangi latensi transmisi jaringan. Bidang lain dalam hasil query serupa dengan bidang dalam hasil query dari query dasar.

Query berformat JSON

  • Permintaan query (pernyataan JOIN tidak didukung)
    POST /_alisql? format=org
    {
      "query": "select * from monitor where host= ? ",
      "params": [{"type":"STRING","value":"100.80.xx.xx"}],
      "fetch_size": 1
    }

    format=org menunjukkan bahwa hasil query berada dalam format JSON. Parameter lainnya sama dengan yang digunakan dalam query dasar. Untuk informasi lebih lanjut, lihat Query Dasar.

  • Hasil query
    {
      "_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"
            }
          }
        ]
      }
    }

    Hasil query memiliki format yang sama dengan pernyataan bahasa domain-spesifik (DSL). Parameter _scroll_id dalam hasil query digunakan untuk query halaman.

Query Terjemahan

Anda dapat menggunakan query terjemahan untuk mengonversi pernyataan SQL menjadi pernyataan DSL yang didukung oleh Elasticsearch.

  • Permintaan query (pernyataan JOIN tidak didukung)
    POST _alisql/translate
    {
      "query": "select * from monitor where host= '100.80.xx.xx' "
    }
  • Hasil query
    {
      "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": []
      }
    }

Query Khusus

Plug-in aliyun-sql memungkinkan Anda meminta data berdasarkan bidang bertipe nested dan text.

  1. Buat skema tabel.
    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. Masukkan sejumlah besar data sekaligus.
    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. Minta informasi pengguna berdasarkan bidang second_name bertipe nested.
    POST _alisql
    {
      "query": "select * from user_info where name.second_name='Adams'"
    }
    Hasil berikut dikembalikan:
    {
      "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. Minta informasi pengguna berdasarkan bidang addr bertipe text.
    POST _alisql
    {
      "query": "select * from user_info where addr='Bristol'"
    }
    Hasil berikut dikembalikan:
    {
      "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 hanya dapat ditambahkan selama inisialisasi plug-in aliyun-sql. Berikut adalah langkah-langkah untuk menambahkan UDF date_format:

  1. Definisikan kelas 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. Tambahkan kelas DateFormat ke metode inisialisasi plug-in.
    udfTable.add(KeplerSqlUserDefinedScalarFunction
                    .create("date_format"
                            , DateFormat.class
                            , (JavaTypeFactoryImpl) typeFactory));
  3. Gunakan UDF date_format untuk meminta data.
    select date_format(date_f,'yyyy') from date_test

Fungsi dan Ekspresi Lainnya

TipeNamaContohDeskripsi
Fungsi NumerikABSSELECT ABS(num_field) FROM tableMengembalikan nilai absolut dari sebuah angka.
ACOSSELECT ACOS(num_field) FROM tableMengembalikan arccosinus dari sebuah angka.
ASINSELECT ASIN(num_field) FROM tableMengembalikan arcsinus dari sebuah angka.
ATANSELECT ATAN(num_field) FROM tableMengembalikan arctangent dari sebuah angka.
ATAN2SELECT ATAN2(num_field1,num_field2) FROM tableMengembalikan arctangent dari dua angka.
CEILSELECT CEIL(num_field) FROM tableMengembalikan bilangan bulat terkecil yang lebih besar dari atau sama dengan sebuah angka.
CBRTSELECT CBRT(num_field) FROM tableMengembalikan akar pangkat tiga presisi ganda dari sebuah angka.
COSSELECT COS(num_field) FROM tableMengembalikan cosinus dari sebuah angka.
COTSELECT COT(num_field) FROM tableMengembalikan cotangen dari sebuah angka.
DEGREESSELECT DEGREES(num_field) FROM tableMengonversi radian menjadi derajat.
EXP or EXPM1SELECT EXP(num_field) FROM tableMengembalikan nilai e dipangkatkan sebuah angka.
FLOORSELECT FLOOR(num_field) FROM tableMengembalikan bilangan bulat terbesar yang kurang dari atau sama dengan sebuah angka.
SINSELECT SIN(num_field) FROM tableMengembalikan sinus dari sebuah angka.
SINHSELECT SINH(num_field) FROM tableMengembalikan sinus hiperbolik dari sebuah angka.
SQRTSELECT SQRT(num_field) FROM tableMengembalikan akar kuadrat positif dari sebuah angka.
TANSELECT TAN(num_field) FROM tableMengembalikan arctangent dari sebuah angka.
ROUNDSELECT ROUND(num_field,2) FROM tableMembulatkan angka ke tempat desimal tertentu.
RADIANS SELECT RADIANS (num_field) FROM tableMengonversi sudut dalam derajatke dalam radian yang setara.
RANDSELECT RAND() FROM tableMengembalikan angka presisi ganda dengan tanda positif. Angka tersebut harus lebih besar dari atau sama dengan 0,0 dan kurang dari 1,0.
LNSELECT LN (num_field) FROM tableMengembalikan logaritma natural dari sebuah angka.
LOG10SELECT LOG10 (num_field) FROM tableMengembalikan logaritma basis 10 dari sebuah angka.
PISELECT PI() FROM tableMengembalikan nilai PI.
POWERSELECT POWER (num_field,2) FROM tableMengembalikan hasil dari sebuah angka yang dipangkatkan.
TRUNCATE SELECT TRUNCATE (num_field,2) FROM tableMemotong angka ke tempat desimal tertentu.
Operasi Aritmatika+SELECT (v1 + v2) as v FROM tableMengembalikan jumlah dari dua angka.
-SELECT(v1 - v2) as v FROM tableMengembalikan selisih dari dua angka.
*SELECT(v1 * v2) as v FROM tableMengembalikan produk dari dua angka.
/SELECT(v1 / v2) as v FROM tableMengembalikan hasil bagi dari satu angka dibagi oleh angka lainnya.
%SELECT(v1 % v2) as v FROM tableMengembalikan sisa dari satu angka dibagi oleh angka lainnya.
Operasi LogikaANDSELECT * FROM table WHERE condition AND conditionMengembalikan data untuk query di mana operasi AND dilakukan pada dua kondisi.
ORSELECT * FROM table WHERE condition OR conditionMengembalikan data untuk query di mana operasi OR dilakukan pada dua kondisi.
NOTSELECT * FROM table WHERE NOT conditionMengembalikan data untuk query di mana suatu kondisi dikecualikan.
IS NULLSELECT * FROM table WHERE field IS NULLMengembalikan data untuk query di mana nilai bidang tertentu adalah null.
IS NOT NULLSELECT * FROM table WHERE field IS NOT NULLMengembalikan data untuk query di mana nilai bidang tertentu bukan null.
Fungsi StringASCIISELECT ASCII(str_field) FROM tableMengembalikan nilai ASCII dari sebuah karakter.
LCASE or LOWERSELECT LCASE(str_field) FROM tableMengonversi string menjadi huruf kecil.
UCASE or UPPERSELECT UCASE(str_field) FROM tableMengonversi string menjadi huruf besar.
CHAR_LENGTH or CHARACTER_LENGTHSELECT CHAR_LENGTH(str_field) FROM tableMengembalikan panjang string dalam byte.
TRIMSELECT TRIM(str_field) FROM tableMemotong string dengan menghapus spasi di awal dan akhir string.
SPACESELECT SPACE(num_field) FROM tableMengembalikan string yang mencakup sejumlah spasi tertentu.
LEFTSELECT LEFT(str_field, 3) FROM tableMengembalikan sejumlah karakter paling kiri dari sebuah string.
RIGHTSELECT RIGHT(str_field, 3) FROM tableMengembalikan sejumlah karakter paling kanan dari sebuah string.
REPEATSELECT REPEAT(str_field, 3) FROM tableMengulangi string sejumlah kali tertentu dan mengembalikan string hasilnya.
REPLACESELECT REPLACE(str_field, "SQL", "HTML") FROM tableMengganti substring dengan substring baru dalam sebuah string.
POSITIONSELECT POSITION("test" IN str_field) FROM tableMengembalikan posisi di mana substring muncul dalam sebuah string untuk pertama kalinya.
REVERSESELECT REVERSE(str_test) from tableMembalikkan string dan mengembalikan string hasilnya.
LPADSELECT LPAD(str_field, 20, "ABC") FROM tableMenambahkan karakter tertentu ke string berdasarkan panjang tertentu.
CONCATSELECT CONCAT(str_field,'test') FROM tableMenggabungkan dua atau lebih string dan mengembalikan string hasilnya.
SUBSTRINGSELECT SUBSTRING(str_field, 5, 3) FROM tableMengembalikan substring yang diekstraksi dari string berdasarkan posisi karakter yang ditentukan.
Fungsi TanggalCURRENT_DATESELECT CURRENT_DATE() FROM tableMengembalikan tanggal saat ini.
CURRENT_TIMESELECT CURRENT_TIME() FROM tableMengembalikan waktu saat ini.
CURRENT_TIMESTAMPSELECT CURRENT_TIMESTAMP() FROM tableMengembalikan tanggal dan waktu saat ini.
DAYNAMESELECT DAYNAME(date_field) FROM tableMengembalikan hari dalam seminggu untuk sebuah tanggal.
DAYOFMONTHSELECT DAYOFMONTH(date_field) FROM tableMengembalikan indeks hari dalam sebulan untuk sebuah tanggal.
DAYOFYEARSELECT DAYOFYEAR(date_field) FROM tableMengembalikan indeks hari dalam setahun untuk sebuah tanggal.
DAYOFWEEKSELECT DAYOFWEEK(date_field) FROM tableMengembalikan indeks hari dalam seminggu untuk sebuah tanggal.
HOURSELECT HOUR(date_field) FROM tableMengembalikan bagian jam dari sebuah tanggal.
MINUTESELECT MINUTE(date_field) FROM tableMengembalikan bagian menit dari waktu atau datetime.
SECONDSELECT SECOND(date_field) FROM tableMengembalikan bagian detik dari waktu atau datetime.
YEARSELECT YEAR(date_field) FROM tableMengembalikan bagian tahun dari sebuah tanggal.
MONTHSELECT MONTH(date_field) FROM tableMengembalikan bagian bulan dari sebuah tanggal.
WEEKSELECT WEEK(date_field) FROM tableMengembalikan indeks minggu di mana sebuah tanggal jatuh. Nilai valid untuk plug-in aliyun-sql: 1 hingga 54. Nilai valid untuk MySQL: 0 hingga 53.
MONTHNAMESELECT MONTHNAME(date_field) FROM tableMengembalikan nama bulan untuk sebuah tanggal.
LAST_DAYSELECT LAST_DAY(date_field) FROM tableMengembalikan hari terakhir dalam bulan untuk sebuah tanggal.
QUARTERSELECT QUARTER(date_field) FROM tableMengembalikan kuartal dalam setahun untuk sebuah tanggal.
EXTRACTSELECT EXTRACT(MONTH FROM date_field) FROM tableMengembalikan satu atau lebih bagian terpisah dari tanggal atau waktu. Misalnya, fungsi ini dapat mengembalikan bagian tahun, bulan, hari, jam, atau menit dari tanggal atau waktu.
DATE_FORMATSELECT DATE_FORMAT(date_field,'yyyy') from date_testMemformat tanggal atau waktu.
Fungsi AgregasiMINSELECT MIN(num_field) FROM tableMengembalikan nilai minimum di antara sekumpulan nilai.
MAXSELECT MAX(num_field) FROM tableMengembalikan nilai maksimum di antara sekumpulan nilai.
AVGSELECT AVG(num_field) FROM tableMengembalikan rata-rata dari sekumpulan nilai.
SUMSELECT SUM(num_field) FROM tableMengembalikan jumlah dari sekumpulan nilai.
COUNTSELECT COUNT(num_field) FROM tableMengembalikan jumlah rekaman yang memenuhi kondisi tertentu.
Fungsi LanjutanCASESELECT * FROM table ORDER BY(CASE WHEN exp1 THEN exp2 ELSE exp3 END)Sintaksnya adalah CASE WHEN THEN ELSE END. Jika kondisi yang ditentukan dalam klausa WHEN terpenuhi, nilai yang ditentukan dalam klausa THEN dikembalikan. Jika kondisi tidak terpenuhi, nilai yang ditentukan dalam klausa ELSE dikembalikan. Sintaks pernyataan CASE serupa dengan pernyataan IF THEN ELSE.