All Products
Search
Document Center

Elasticsearch:Sintaksis kueri

Last Updated:Mar 26, 2026

Plugin aliyun-sql mendukung jenis kueri berikut: kueri dasar, kueri terpaginasi dengan kursor, kueri berformat JSON, kueri terjemahan (translate), kueri khusus (tipe data nested dan text), fungsi yang ditentukan pengguna (UDF), serta sekumpulan fungsi dan ekspresi bawaan.

Untuk menguji kueri secara interaktif, gunakan konsol Kibana. Untuk instruksi penyiapan, lihat Metode penggunaan.

Konsep utama

Petakan pengetahuan SQL Anda ke terminologi Elasticsearch sebelum menulis kueri:

SQLElasticsearch
TableIndex
RowDocument
ColumnField

Plugin ini dibangun di atas Apache Calcite dan menerjemahkan pernyataan SQL ke kueri domain-specific language (DSL) Elasticsearch pada waktu proses.

Kueri dasar

Semua kueri dasar menggunakan titik akhir POST /_alisql.

Kueri umum

POST /_alisql?pretty
{
  "query": "select * from monitor where host='100.80.xx.xx' limit 5"
}

Kueri dengan ukuran fetch

POST /_alisql?pretty
{
  "query": "select * from monitor",
  "fetch_size": 3
}

Kueri terparameterisasi

Gunakan params untuk meneruskan nilai bertipe ke dalam kueri, mirip dengan antarmuka PreparedStatement di JDBC:

POST /_alisql?pretty
{
  "query": "select * from monitor where host= ? ",
  "params": [{"type":"STRING","value":"100.80.xx.xx"}],
  "fetch_size": 1
}

Parameter permintaan

ParameterTipeWajibDeskripsi
prettyParameter URLTidakMemformat respons agar mudah dibaca.
queryStringYaPernyataan SQL yang akan dieksekusi. Contoh: select * from monitor where host='100.80.xx.xx' limit 5
fetch_sizeIntegerTidakJumlah hasil yang dikembalikan per respons. Nilai default: 1000. Maksimum: 10000. Jika nilainya melebihi 10000, sistem akan menggunakan 10000.
paramsArrayTidakNilai parameter bertipe untuk kueri terparameterisasi. Contoh: [{"type":"STRING","value":"100.80.xx.xx"}]

`limit` vs `fetch_size`: Keduanya membatasi hasil, tetapi bekerja secara berbeda:

  • limit: membatasi jumlah total hasil, mendukung kueri penuh atau kueri rentang.

  • fetch_size: mengontrol ukuran halaman untuk paginasi berbasis kursor, mirip dengan Scroll API.

Bidang respons

Contoh respons khas:

{
  "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****"
}
BidangTipe dataDeskripsi
columnsArrayNama dan tipe data bidang yang dikueri.
rowsArray 2DHasil kueri. Setiap array dalamnya merepresentasikan satu dokumen yang sesuai.
cursorStringToken kursor untuk mengambil halaman hasil berikutnya. Hanya muncul jika masih ada hasil tambahan.
Secara default, hingga 1.000 hasil dikembalikan. Untuk set hasil yang lebih besar, gunakan paginasi berbasis kursor untuk mengambil seluruh data.

Kueri terpaginasi

Untuk set hasil yang besar, gunakan paginasi berbasis kursor.

Langkah 1 — Permintaan awal dengan `fetch_size`:

POST /_alisql?pretty
{
  "query": "select * from monitor",
  "fetch_size": 3
}

Respons mencakup token cursor jika masih tersedia data tambahan.

Langkah 2 — Lanjutkan dengan kursor:

Teruskan nilai cursor dari respons sebelumnya untuk mengambil halaman berikutnya:

POST /_alisql?pretty
{
  "cursor": "u5HzAgJzY0BEWEYxWlhKNVFXNWtS****"
}

Respons kueri kursor menghilangkan bidang columns untuk mengurangi latensi jaringan. Semua bidang lain mengikuti struktur yang sama seperti respons awal.

Langkah 3 — Kondisi akhir:

Lanjutkan mengirim permintaan kursor hingga respons tidak lagi berisi bidang cursor atau tidak ada rows. Pada titik tersebut, seluruh data telah diambil.

Parameter permintaan kursor

ParameterTipeWajibDeskripsi
prettyParameter URLTidakMemformat respons agar mudah dibaca.
cursorStringYaToken kursor dari respons sebelumnya.

Kueri berformat JSON

Tambahkan format=org untuk mengembalikan hasil dalam format JSON yang sama seperti kueri DSL Elasticsearch asli. 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
}

Respons menggunakan struktur hits standar Elasticsearch:

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

Gunakan bidang _scroll_id untuk kueri terpaginasi saat bekerja dengan format ini. Semua parameter permintaan lainnya sama seperti pada kueri dasar.

Kueri terjemahan (translate)

API translate mengonversi pernyataan SQL menjadi kueri DSL Elasticsearch yang setara. Gunakan fitur ini untuk men-debug kueri atau memahami bagaimana plugin memetakan kondisi SQL ke filter DSL. Pernyataan JOIN tidak didukung.

POST _alisql/translate
{
  "query": "select * from monitor where host= '100.80.xx.xx' "
}

Respons berupa ekuivalen DSL dari kueri SQL tersebut:

{
  "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": []
  }
}

Kueri khusus

Plugin aliyun-sql mendukung pengkuerian bidang dengan tipe data nested dan text, yang tidak dapat dikueri secara langsung di database SQL standar.

Langkah 1 — Buat indeks dengan bidang nested dan text:

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"}
          }
        }
      }
    }
  }
}

Langkah 2 — Masukkan dokumen secara massal:

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"}}

Langkah 3 — Kueri bidang nested:

Gunakan notasi titik untuk mereferensikan bidang nested:

POST _alisql
{
  "query": "select * from user_info where name.second_name='Adams'"
}

Respons:

{
  "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"]
  ]
}

Langkah 4 — Mencari di bidang teks:

Filter pada bidang bertipe text menggunakan pencocokan kata kunci:

POST _alisql
{
  "query": "select * from user_info where addr='Bristol'"
}

Respons:

{
  "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"]
  ]
}

Fungsi dan ekspresi bawaan

Fungsi numerik

FungsiSignatureContohDeskripsi
ABSABS(number) -> numberSELECT ABS(num_field) FROM tableMengembalikan nilai absolut.
ACOSACOS(number) -> doubleSELECT ACOS(num_field) FROM tableMengembalikan arccosinus.
ASINASIN(number) -> doubleSELECT ASIN(num_field) FROM tableMengembalikan arcsinus.
ATANATAN(number) -> doubleSELECT ATAN(num_field) FROM tableMengembalikan arctangen.
ATAN2ATAN2(number, number) -> doubleSELECT ATAN2(num_field1,num_field2) FROM tableMengembalikan arctangen dari dua angka.
CBRTCBRT(number) -> doubleSELECT CBRT(num_field) FROM tableMengembalikan akar pangkat tiga presisi ganda.
CEILCEIL(number) -> integerSELECT CEIL(num_field) FROM tableMengembalikan bilangan bulat terkecil yang lebih besar dari atau sama dengan input.
COSCOS(number) -> doubleSELECT COS(num_field) FROM tableMengembalikan cosinus.
COTCOT(number) -> doubleSELECT COT(num_field) FROM tableMengembalikan cotangen.
DEGREESDEGREES(number) -> doubleSELECT DEGREES(num_field) FROM tableMengonversi radian ke derajat.
EXP or EXPM1EXP(number) -> doubleSELECT EXP(num_field) FROM tableMengembalikan e pangkat input.
FLOORFLOOR(number) -> integerSELECT FLOOR(num_field) FROM tableMengembalikan bilangan bulat terbesar yang kurang dari atau sama dengan input.
LNLN(number) -> doubleSELECT LN(num_field) FROM tableMengembalikan logaritma natural.
LOG10LOG10(number) -> doubleSELECT LOG10(num_field) FROM tableMengembalikan logaritma basis 10.
PIPI() -> doubleSELECT PI() FROM tableMengembalikan nilai pi.
POWERPOWER(number, number) -> doubleSELECT POWER(num_field,2) FROM tableMengembalikan hasil dari pemangkatan suatu angka.
RADIANSRADIANS(number) -> doubleSELECT RADIANS(num_field) FROM tableMengonversi derajat ke radian.
RANDRAND() -> doubleSELECT RAND() FROM tableMengembalikan bilangan acak presisi ganda dalam rentang [0.0, 1.0).
ROUNDROUND(number, integer) -> numberSELECT ROUND(num_field,2) FROM tableMembulatkan ke jumlah tempat desimal yang ditentukan.
SINSIN(number) -> doubleSELECT SIN(num_field) FROM tableMengembalikan sinus.
SINHSINH(number) -> doubleSELECT SINH(num_field) FROM tableMengembalikan sinus hiperbolik.
SQRTSQRT(number) -> doubleSELECT SQRT(num_field) FROM tableMengembalikan akar kuadrat positif.
TANTAN(number) -> doubleSELECT TAN(num_field) FROM tableMengembalikan tangen.
TRUNCATETRUNCATE(number, integer) -> numberSELECT TRUNCATE(num_field,2) FROM tableMemotong ke jumlah tempat desimal yang ditentukan.

Fungsi string

FungsiSignatureContohDeskripsi
ASCIIASCII(string) -> integerSELECT ASCII(str_field) FROM tableMengembalikan nilai ASCII karakter pertama.
CHAR_LENGTH or CHARACTER_LENGTHCHAR_LENGTH(string) -> integerSELECT CHAR_LENGTH(str_field) FROM tableMengembalikan panjang string dalam byte.
CONCATCONCAT(string, ...) -> stringSELECT CONCAT(str_field,'test') FROM tableMenggabungkan dua atau lebih string.
LCASE or LOWERLCASE(string) -> stringSELECT LCASE(str_field) FROM tableMengonversi string ke huruf kecil.
LEFTLEFT(string, integer) -> stringSELECT LEFT(str_field, 3) FROM tableMengembalikan jumlah karakter paling kiri yang ditentukan.
LPADLPAD(string, integer, string) -> stringSELECT LPAD(str_field, 20, 'ABC') FROM tableMelengkapi string di sebelah kiri hingga panjang tertentu dengan string pelengkap.
POSITIONPOSITION(string IN string) -> integerSELECT POSITION('test' IN str_field) FROM tableMengembalikan posisi kemunculan pertama substring.
REPEATREPEAT(string, integer) -> stringSELECT REPEAT(str_field, 3) FROM tableMengulang string sejumlah kali yang ditentukan.
REPLACEREPLACE(string, string, string) -> stringSELECT REPLACE(str_field, 'SQL', 'HTML') FROM tableMengganti semua kemunculan substring dengan substring baru.
REVERSEREVERSE(string) -> stringSELECT REVERSE(str_test) FROM tableMembalik urutan string.
RIGHTRIGHT(string, integer) -> stringSELECT RIGHT(str_field, 3) FROM tableMengembalikan jumlah karakter paling kanan yang ditentukan.
SPACESPACE(integer) -> stringSELECT SPACE(num_field) FROM tableMengembalikan string yang terdiri dari jumlah spasi yang ditentukan.
SUBSTRINGSUBSTRING(string, integer, integer) -> stringSELECT SUBSTRING(str_field, 5, 3) FROM tableMengekstrak substring mulai dari posisi yang ditentukan.
TRIMTRIM(string) -> stringSELECT TRIM(str_field) FROM tableMenghapus spasi di awal dan akhir.
UCASE or UPPERUCASE(string) -> stringSELECT UCASE(str_field) FROM tableMengonversi string ke huruf kapital.

Fungsi tanggal

FungsiSignatureContohDeskripsi
CURRENT_DATECURRENT_DATE() -> dateSELECT CURRENT_DATE() FROM tableMengembalikan tanggal saat ini.
CURRENT_TIMECURRENT_TIME() -> timeSELECT CURRENT_TIME() FROM tableMengembalikan waktu saat ini.
CURRENT_TIMESTAMPCURRENT_TIMESTAMP() -> timestampSELECT CURRENT_TIMESTAMP() FROM tableMengembalikan tanggal dan waktu saat ini.
DATE_FORMATDATE_FORMAT(date, string) -> stringSELECT DATE_FORMAT(date_field,'yyyy') FROM date_testMemformat tanggal atau waktu menggunakan pola yang ditentukan.
DAYNAMEDAYNAME(date) -> stringSELECT DAYNAME(date_field) FROM tableMengembalikan nama hari dalam minggu.
DAYOFMONTHDAYOFMONTH(date) -> integerSELECT DAYOFMONTH(date_field) FROM tableMengembalikan hari dalam bulan (1–31).
DAYOFWEEKDAYOFWEEK(date) -> integerSELECT DAYOFWEEK(date_field) FROM tableMengembalikan indeks hari dalam minggu.
DAYOFYEARDAYOFYEAR(date) -> integerSELECT DAYOFYEAR(date_field) FROM tableMengembalikan hari dalam tahun (1–366).
EXTRACTEXTRACT(part FROM date) -> integerSELECT EXTRACT(MONTH FROM date_field) FROM tableMengekstrak bagian yang ditentukan (tahun, bulan, hari, jam, atau menit) dari tanggal atau waktu.
HOURHOUR(date) -> integerSELECT HOUR(date_field) FROM tableMengembalikan bagian jam.
LAST_DAYLAST_DAY(date) -> dateSELECT LAST_DAY(date_field) FROM tableMengembalikan hari terakhir dalam bulan.
MINUTEMINUTE(time) -> integerSELECT MINUTE(date_field) FROM tableMengembalikan bagian menit.
MONTHMONTH(date) -> integerSELECT MONTH(date_field) FROM tableMengembalikan bulan (1–12).
MONTHNAMEMONTHNAME(date) -> stringSELECT MONTHNAME(date_field) FROM tableMengembalikan nama bulan.
QUARTERQUARTER(date) -> integerSELECT QUARTER(date_field) FROM tableMengembalikan kuartal tahun (1–4).
SECONDSECOND(time) -> integerSELECT SECOND(date_field) FROM tableMengembalikan bagian kedua.
WEEKWEEK(date) -> integerSELECT WEEK(date_field) FROM tableMengembalikan indeks minggu. Nilai valid: 1–54 (berbeda dari MySQL yang 0–53).
YEARYEAR(date) -> integerSELECT YEAR(date_field) FROM tableMengembalikan bagian tahun.

Fungsi agregasi

FungsiSignatureContohDeskripsi
AVGAVG(number) -> doubleSELECT AVG(num_field) FROM tableMengembalikan rata-rata nilai.
COUNTCOUNT(field) -> integerSELECT COUNT(num_field) FROM tableMengembalikan jumlah catatan yang sesuai.
MAXMAX(T) -> TSELECT MAX(num_field) FROM tableMengembalikan nilai maksimum.
MINMIN(T) -> TSELECT MIN(num_field) FROM tableMengembalikan nilai minimum.
SUMSUM(number) -> numberSELECT SUM(num_field) FROM tableMengembalikan jumlah nilai.

Operasi aritmetika

OperatorContohDeskripsi
+SELECT (v1 + v2) as v FROM tablePenjumlahan.
-SELECT (v1 - v2) as v FROM tablePengurangan.
*SELECT (v1 * v2) as v FROM tablePerkalian.
/SELECT (v1 / v2) as v FROM tablePembagian.
%SELECT (v1 % v2) as v FROM tableModulo (sisa bagi).

Operasi logika

OperatorContohDeskripsi
ANDSELECT * FROM table WHERE condition AND conditionKedua kondisi harus bernilai true.
ORSELECT * FROM table WHERE condition OR conditionSetidaknya satu kondisi harus bernilai true.
NOTSELECT * FROM table WHERE NOT conditionMenegasikan kondisi.
IS NULLSELECT * FROM table WHERE field IS NULLMencocokkan dokumen di mana bidang bernilai null.
IS NOT NULLSELECT * FROM table WHERE field IS NOT NULLMencocokkan dokumen di mana bidang tidak bernilai null.

Fungsi lanjutan

FungsiSintaksisContohDeskripsi
CASECASE WHEN condition THEN value ELSE value ENDSELECT * FROM table ORDER BY (CASE WHEN exp1 THEN exp2 ELSE exp3 END)Mengembalikan exp2 jika exp1 bernilai true, jika tidak mengembalikan exp3. Setara dengan pernyataan IF-THEN-ELSE.