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:
| SQL | Elasticsearch |
|---|---|
| Table | Index |
| Row | Document |
| Column | Field |
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
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
pretty | Parameter URL | Tidak | Memformat respons agar mudah dibaca. |
query | String | Ya | Pernyataan SQL yang akan dieksekusi. Contoh: select * from monitor where host='100.80.xx.xx' limit 5 |
fetch_size | Integer | Tidak | Jumlah hasil yang dikembalikan per respons. Nilai default: 1000. Maksimum: 10000. Jika nilainya melebihi 10000, sistem akan menggunakan 10000. |
params | Array | Tidak | Nilai 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****"
}| Bidang | Tipe data | Deskripsi |
|---|---|---|
columns | Array | Nama dan tipe data bidang yang dikueri. |
rows | Array 2D | Hasil kueri. Setiap array dalamnya merepresentasikan satu dokumen yang sesuai. |
cursor | String | Token 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
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
pretty | Parameter URL | Tidak | Memformat respons agar mudah dibaca. |
cursor | String | Ya | Token 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
| Fungsi | Signature | Contoh | Deskripsi |
|---|---|---|---|
| ABS | ABS(number) -> number | SELECT ABS(num_field) FROM table | Mengembalikan nilai absolut. |
| ACOS | ACOS(number) -> double | SELECT ACOS(num_field) FROM table | Mengembalikan arccosinus. |
| ASIN | ASIN(number) -> double | SELECT ASIN(num_field) FROM table | Mengembalikan arcsinus. |
| ATAN | ATAN(number) -> double | SELECT ATAN(num_field) FROM table | Mengembalikan arctangen. |
| ATAN2 | ATAN2(number, number) -> double | SELECT ATAN2(num_field1,num_field2) FROM table | Mengembalikan arctangen dari dua angka. |
| CBRT | CBRT(number) -> double | SELECT CBRT(num_field) FROM table | Mengembalikan akar pangkat tiga presisi ganda. |
| CEIL | CEIL(number) -> integer | SELECT CEIL(num_field) FROM table | Mengembalikan bilangan bulat terkecil yang lebih besar dari atau sama dengan input. |
| COS | COS(number) -> double | SELECT COS(num_field) FROM table | Mengembalikan cosinus. |
| COT | COT(number) -> double | SELECT COT(num_field) FROM table | Mengembalikan cotangen. |
| DEGREES | DEGREES(number) -> double | SELECT DEGREES(num_field) FROM table | Mengonversi radian ke derajat. |
| EXP or EXPM1 | EXP(number) -> double | SELECT EXP(num_field) FROM table | Mengembalikan e pangkat input. |
| FLOOR | FLOOR(number) -> integer | SELECT FLOOR(num_field) FROM table | Mengembalikan bilangan bulat terbesar yang kurang dari atau sama dengan input. |
| LN | LN(number) -> double | SELECT LN(num_field) FROM table | Mengembalikan logaritma natural. |
| LOG10 | LOG10(number) -> double | SELECT LOG10(num_field) FROM table | Mengembalikan logaritma basis 10. |
| PI | PI() -> double | SELECT PI() FROM table | Mengembalikan nilai pi. |
| POWER | POWER(number, number) -> double | SELECT POWER(num_field,2) FROM table | Mengembalikan hasil dari pemangkatan suatu angka. |
| RADIANS | RADIANS(number) -> double | SELECT RADIANS(num_field) FROM table | Mengonversi derajat ke radian. |
| RAND | RAND() -> double | SELECT RAND() FROM table | Mengembalikan bilangan acak presisi ganda dalam rentang [0.0, 1.0). |
| ROUND | ROUND(number, integer) -> number | SELECT ROUND(num_field,2) FROM table | Membulatkan ke jumlah tempat desimal yang ditentukan. |
| SIN | SIN(number) -> double | SELECT SIN(num_field) FROM table | Mengembalikan sinus. |
| SINH | SINH(number) -> double | SELECT SINH(num_field) FROM table | Mengembalikan sinus hiperbolik. |
| SQRT | SQRT(number) -> double | SELECT SQRT(num_field) FROM table | Mengembalikan akar kuadrat positif. |
| TAN | TAN(number) -> double | SELECT TAN(num_field) FROM table | Mengembalikan tangen. |
| TRUNCATE | TRUNCATE(number, integer) -> number | SELECT TRUNCATE(num_field,2) FROM table | Memotong ke jumlah tempat desimal yang ditentukan. |
Fungsi string
| Fungsi | Signature | Contoh | Deskripsi |
|---|---|---|---|
| ASCII | ASCII(string) -> integer | SELECT ASCII(str_field) FROM table | Mengembalikan nilai ASCII karakter pertama. |
| CHAR_LENGTH or CHARACTER_LENGTH | CHAR_LENGTH(string) -> integer | SELECT CHAR_LENGTH(str_field) FROM table | Mengembalikan panjang string dalam byte. |
| CONCAT | CONCAT(string, ...) -> string | SELECT CONCAT(str_field,'test') FROM table | Menggabungkan dua atau lebih string. |
| LCASE or LOWER | LCASE(string) -> string | SELECT LCASE(str_field) FROM table | Mengonversi string ke huruf kecil. |
| LEFT | LEFT(string, integer) -> string | SELECT LEFT(str_field, 3) FROM table | Mengembalikan jumlah karakter paling kiri yang ditentukan. |
| LPAD | LPAD(string, integer, string) -> string | SELECT LPAD(str_field, 20, 'ABC') FROM table | Melengkapi string di sebelah kiri hingga panjang tertentu dengan string pelengkap. |
| POSITION | POSITION(string IN string) -> integer | SELECT POSITION('test' IN str_field) FROM table | Mengembalikan posisi kemunculan pertama substring. |
| REPEAT | REPEAT(string, integer) -> string | SELECT REPEAT(str_field, 3) FROM table | Mengulang string sejumlah kali yang ditentukan. |
| REPLACE | REPLACE(string, string, string) -> string | SELECT REPLACE(str_field, 'SQL', 'HTML') FROM table | Mengganti semua kemunculan substring dengan substring baru. |
| REVERSE | REVERSE(string) -> string | SELECT REVERSE(str_test) FROM table | Membalik urutan string. |
| RIGHT | RIGHT(string, integer) -> string | SELECT RIGHT(str_field, 3) FROM table | Mengembalikan jumlah karakter paling kanan yang ditentukan. |
| SPACE | SPACE(integer) -> string | SELECT SPACE(num_field) FROM table | Mengembalikan string yang terdiri dari jumlah spasi yang ditentukan. |
| SUBSTRING | SUBSTRING(string, integer, integer) -> string | SELECT SUBSTRING(str_field, 5, 3) FROM table | Mengekstrak substring mulai dari posisi yang ditentukan. |
| TRIM | TRIM(string) -> string | SELECT TRIM(str_field) FROM table | Menghapus spasi di awal dan akhir. |
| UCASE or UPPER | UCASE(string) -> string | SELECT UCASE(str_field) FROM table | Mengonversi string ke huruf kapital. |
Fungsi tanggal
| Fungsi | Signature | Contoh | Deskripsi |
|---|---|---|---|
| CURRENT_DATE | CURRENT_DATE() -> date | SELECT CURRENT_DATE() FROM table | Mengembalikan tanggal saat ini. |
| CURRENT_TIME | CURRENT_TIME() -> time | SELECT CURRENT_TIME() FROM table | Mengembalikan waktu saat ini. |
| CURRENT_TIMESTAMP | CURRENT_TIMESTAMP() -> timestamp | SELECT CURRENT_TIMESTAMP() FROM table | Mengembalikan tanggal dan waktu saat ini. |
| DATE_FORMAT | DATE_FORMAT(date, string) -> string | SELECT DATE_FORMAT(date_field,'yyyy') FROM date_test | Memformat tanggal atau waktu menggunakan pola yang ditentukan. |
| DAYNAME | DAYNAME(date) -> string | SELECT DAYNAME(date_field) FROM table | Mengembalikan nama hari dalam minggu. |
| DAYOFMONTH | DAYOFMONTH(date) -> integer | SELECT DAYOFMONTH(date_field) FROM table | Mengembalikan hari dalam bulan (1–31). |
| DAYOFWEEK | DAYOFWEEK(date) -> integer | SELECT DAYOFWEEK(date_field) FROM table | Mengembalikan indeks hari dalam minggu. |
| DAYOFYEAR | DAYOFYEAR(date) -> integer | SELECT DAYOFYEAR(date_field) FROM table | Mengembalikan hari dalam tahun (1–366). |
| EXTRACT | EXTRACT(part FROM date) -> integer | SELECT EXTRACT(MONTH FROM date_field) FROM table | Mengekstrak bagian yang ditentukan (tahun, bulan, hari, jam, atau menit) dari tanggal atau waktu. |
| HOUR | HOUR(date) -> integer | SELECT HOUR(date_field) FROM table | Mengembalikan bagian jam. |
| LAST_DAY | LAST_DAY(date) -> date | SELECT LAST_DAY(date_field) FROM table | Mengembalikan hari terakhir dalam bulan. |
| MINUTE | MINUTE(time) -> integer | SELECT MINUTE(date_field) FROM table | Mengembalikan bagian menit. |
| MONTH | MONTH(date) -> integer | SELECT MONTH(date_field) FROM table | Mengembalikan bulan (1–12). |
| MONTHNAME | MONTHNAME(date) -> string | SELECT MONTHNAME(date_field) FROM table | Mengembalikan nama bulan. |
| QUARTER | QUARTER(date) -> integer | SELECT QUARTER(date_field) FROM table | Mengembalikan kuartal tahun (1–4). |
| SECOND | SECOND(time) -> integer | SELECT SECOND(date_field) FROM table | Mengembalikan bagian kedua. |
| WEEK | WEEK(date) -> integer | SELECT WEEK(date_field) FROM table | Mengembalikan indeks minggu. Nilai valid: 1–54 (berbeda dari MySQL yang 0–53). |
| YEAR | YEAR(date) -> integer | SELECT YEAR(date_field) FROM table | Mengembalikan bagian tahun. |
Fungsi agregasi
| Fungsi | Signature | Contoh | Deskripsi |
|---|---|---|---|
| AVG | AVG(number) -> double | SELECT AVG(num_field) FROM table | Mengembalikan rata-rata nilai. |
| COUNT | COUNT(field) -> integer | SELECT COUNT(num_field) FROM table | Mengembalikan jumlah catatan yang sesuai. |
| MAX | MAX(T) -> T | SELECT MAX(num_field) FROM table | Mengembalikan nilai maksimum. |
| MIN | MIN(T) -> T | SELECT MIN(num_field) FROM table | Mengembalikan nilai minimum. |
| SUM | SUM(number) -> number | SELECT SUM(num_field) FROM table | Mengembalikan jumlah nilai. |
Operasi aritmetika
| Operator | Contoh | Deskripsi |
|---|---|---|
+ | SELECT (v1 + v2) as v FROM table | Penjumlahan. |
- | SELECT (v1 - v2) as v FROM table | Pengurangan. |
* | SELECT (v1 * v2) as v FROM table | Perkalian. |
/ | SELECT (v1 / v2) as v FROM table | Pembagian. |
% | SELECT (v1 % v2) as v FROM table | Modulo (sisa bagi). |
Operasi logika
| Operator | Contoh | Deskripsi |
|---|---|---|
AND | SELECT * FROM table WHERE condition AND condition | Kedua kondisi harus bernilai true. |
OR | SELECT * FROM table WHERE condition OR condition | Setidaknya satu kondisi harus bernilai true. |
NOT | SELECT * FROM table WHERE NOT condition | Menegasikan kondisi. |
IS NULL | SELECT * FROM table WHERE field IS NULL | Mencocokkan dokumen di mana bidang bernilai null. |
IS NOT NULL | SELECT * FROM table WHERE field IS NOT NULL | Mencocokkan dokumen di mana bidang tidak bernilai null. |
Fungsi lanjutan
| Fungsi | Sintaksis | Contoh | Deskripsi |
|---|---|---|---|
| CASE | CASE WHEN condition THEN value ELSE value END | SELECT * 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. |