Topik ini menjelaskan cara mengintegrasikan sumber data Elasticsearch dengan SelectDB untuk melakukan analisis federasi pada sumber data Elasticsearch.
Ikhtisar
Katalog Elasticsearch di ApsaraDB for SelectDB mendukung pemetaan otomatis metadata dari sumber data Elasticsearch. Berdasarkan kemampuan perencanaan kueri terdistribusi ApsaraDB for SelectDB dan pencarian teks lengkap Elasticsearch, Anda dapat menggunakan katalog Elasticsearch untuk menyediakan solusi online analytical processing (OLAP) komprehensif untuk kueri berikut:
Kueri penggabungan terdistribusi multi-indeks di Elasticsearch.
Kueri penggabungan multi-tabel lintas ApsaraDB for SelectDB dan Elasticsearch untuk pencarian teks lengkap dan penyaringan.
ApsaraDB for SelectDB mendukung Elasticsearch 5.X dan yang lebih baru.
Prasyarat
Semua node dalam kluster Elasticsearch harus terhubung ke instance SelectDB.
Semua node dalam kluster Elasticsearch harus berada di virtual private cloud (VPC) yang sama dengan instance SelectDB. Jika node dalam kluster sumber data berada di VPC yang berbeda, Anda harus menghubungkan node tersebut ke instance SelectDB. Untuk informasi lebih lanjut, lihat Apa yang harus saya lakukan jika koneksi gagal dibuat antara instance ApsaraDB for SelectDB dan sumber data?
Alamat IP semua node dalam kluster Elasticsearch harus ditambahkan ke daftar putih alamat IP instance SelectDB. Untuk informasi lebih lanjut, lihat Konfigurasi daftar putih alamat IP.
Alamat IP dalam VPC tempat instance SelectDB berada harus ditambahkan ke daftar putih alamat IP kluster Elasticsearch jika mekanisme daftar putih didukung untuk kluster Elasticsearch.
Untuk mendapatkan alamat IP instance SelectDB dalam VPC tempat instance SelectDB berada, Anda dapat menjalankan operasi yang disediakan di Bagaimana cara melihat alamat IP dalam VPC tempat instance ApsaraDB SelectDB saya berada?
Untuk mendapatkan alamat IP publik instance SelectDB, Anda dapat menjalankan perintah ping untuk mengakses titik akhir publik instance SelectDB dan mendapatkan alamat IP instance tersebut.
Anda memiliki pengetahuan dasar tentang katalog dan memahami operasi yang dapat dilakukan pada katalog. Untuk informasi lebih lanjut, lihat Danau data.
Buat katalog Elasticsearch
CREATE CATALOG test_es PROPERTIES (
"type"="es",
"hosts"="http://127.0.0.1:9200",
"user"="test_user",
"password"="test_passwd",
"nodes_discovery"="false"
);Elasticsearch tidak memiliki konsep database. Oleh karena itu, setelah Anda menghubungkan sumber data Elasticsearch ke ApsaraDB for SelectDB, ApsaraDB for SelectDB secara otomatis membuat database unik bernama default_db. Setelah Anda mengeksekusi pernyataan SWITCH untuk beralih ke katalog Elasticsearch, ApsaraDB for SelectDB secara otomatis beralih ke database default_db tanpa memerlukan Anda untuk mengeksekusi pernyataan USE default_db.
Tabel berikut menjelaskan parameter-parameter tersebut.
Parameter | Diperlukan | Nilai default | Deskripsi |
hosts | Ya | N/A | URL yang digunakan untuk mengakses sumber data Elasticsearch. Anda dapat menentukan satu atau lebih URL atau mengatur parameter ini ke URL instance Server Load Balancer (SLB) dari sumber data Elasticsearch. |
user | Tidak | N/A | Akun yang digunakan untuk mengakses sumber data Elasticsearch. |
password | Tidak | N/A | Kata sandi akun yang digunakan untuk mengakses sumber data Elasticsearch. |
doc_value_scan | Tidak | true | Menentukan apakah akan mengaktifkan fitur penyimpanan berorientasi kolom Elasticsearch atau Apache Lucene untuk menanyakan nilai bidang. |
keyword_sniff | Tidak | true | Menentukan apakah akan mendeteksi bidang tipe TEXT di Elasticsearch dan melakukan kueri menggunakan bidang KEYWORD yang sesuai. Jika Anda mengatur parameter ini ke false, sistem mencocokkan data setelah bidang TEXT dipecah menjadi suku kata. |
nodes_discovery | Tidak | true | Menentukan apakah akan mengaktifkan fitur penemuan node Elasticsearch. Nilai default: true. Catatan Alibaba Cloud Elasticsearch menggunakan instance SLB sebagai pintu masuk untuk menangani permintaan masuk. Ini mencegah akses langsung ke node kluster Elasticsearch. Oleh karena itu, Anda harus mengatur parameter ini ke false. |
ssl | Tidak | false | Menentukan apakah akan mengaktifkan akses HTTPS untuk sumber data Elasticsearch. ApsaraDB for SelectDB dikonfigurasi untuk mempercayai semua permintaan HTTPS dari frontend (FE) dan backend (BE), terlepas dari validitas sertifikat SSL. |
mapping_es_id | Tidak | false | Menentukan apakah akan memetakan bidang |
like_push_down | Tidak | true | Menentukan apakah akan mengonversi kondisi LIKE menjadi wildcard dan mendorong kondisi LIKE ke sumber data Elasticsearch. Ini meningkatkan konsumsi CPU sumber data Elasticsearch. |
include_hidden_index | Tidak | false | Menentukan apakah akan menyertakan indeks tersembunyi. Nilai default: false. |
Hanya otentikasi HTTP dasar yang didukung. Pastikan akun yang digunakan untuk mengakses sumber data Elasticsearch memiliki izin untuk mengakses jalur seperti
/_cluster/state/dan_nodes/httpserta membaca indeks. Jika Anda tidak mengaktifkan akses HTTPS untuk kluster Elasticsearch, Anda tidak perlu menentukan akun atau kata sandi.Secara default, jika indeks di Elasticsearch 5.x atau 6.x berisi beberapa jenis, ApsaraDB for SelectDB membaca data dari jenis pertama.
Kueri data dari sumber data Elasticsearch
Setelah Anda membuat katalog Elasticsearch di ApsaraDB for SelectDB, Anda dapat menanyakan tabel Elasticsearch eksternal di ApsaraDB for SelectDB dengan cara yang sama seperti Anda menanyakan tabel internal di ApsaraDB for SelectDB. Namun, Anda tidak dapat menggunakan model data seperti rollup, pra-agregasi, dan tampilan materialisasi di ApsaraDB for SelectDB.
Kueri dasar
SELECT * FROM es_table WHERE k1 > 1000 AND k3 ='term' OR k4 LIKE 'fu*z_';Kueri esquery diperluas
Anda dapat menggunakan fungsi esquery(field, QueryDSL) untuk mendorong kueri yang tidak dapat diekspresikan dalam SQL, seperti match_phrase dan geoshape, ke Elasticsearch untuk penyaringan. Dalam fungsi esquery(field, QueryDSL), parameter field digunakan untuk mengaitkan indeks, dan parameter QueryDSL menentukan ekspresi JSON dari bahasa domain-spesifik (DSL) dasar kueri di Elasticsearch. Parameter QueryDSL diapit oleh kurung kurawal ({}). Ekspresi JSON harus memiliki hanya satu root key, seperti match_phrase, geo_shape, atau bool. Contoh:
match_phrase query:
SELECT * FROM es_table WHERE esquery(k4, '{ "match_phrase": { "k4": "selectdb on es" } }');geo_shape query:
SELECT * FROM es_table WHERE esquery(k4, '{ "geo_shape": { "location": { "shape": { "type": "envelope", "coordinates": [ [ 13, 53 ], [ 14, 52 ] ] }, "relation": "within" } } }');bool query:
SELECT * FROM es_table WHERE esquery(k4, ' { "bool": { "must": [ { "terms": { "k1": [ 11, 12 ] } }, { "terms": { "k2": [ 100 ] } } ] } }');Pemetaan tipe kolom
Tipe data di Elasticsearch | Tipe data di ApsaraDB for SelectDB | Catatan |
NULL | NULL | N/A |
BOOLEAN | BOOLEAN | N/A |
BYTE | TINYINT | N/A |
SHORT | SMALLINT | N/A |
INTEGER | INT | N/A |
LONG | BIGINT | N/A |
UNSIGNED_LONG | LARGEINT | N/A |
FLOAT | FLOAT | N/A |
HALF_FLOAT | FLOAT | N/A |
DOUBLE | DOUBLE | N/A |
SCALED_FLOAT | DOUBLE | N/A |
DATE | DATE | Hanya format default, yyyy-MM-dd HH:mm:ss, yyyy-MM-dd, dan epoch_millis yang didukung. |
KEYWORD | STRING | N/A |
TEXT | STRING | N/A |
IP | STRING | N/A |
NESTED | STRING | N/A |
OBJECT | STRING | N/A |
OTHER | UNSUPPORTED | N/A |
Tipe ARRAY
Elasticsearch tidak mendukung tipe ARRAY eksplisit, tetapi sebuah bidang di Elasticsearch dapat berisi nol atau lebih nilai. Untuk menandai sebuah bidang sebagai tipe ARRAY, Anda dapat menambahkan anotasi struktural tertentu ke bidang _meta pemetaan indeks untuk ApsaraDB for SelectDB. Untuk informasi lebih lanjut tentang bidang _meta di Elasticsearch 6.x dan sebelumnya, lihat bidang _meta.
Sebagai contoh, indeks doc menggunakan struktur data berikut:
{
"array_int_field": [1, 2, 3, 4],
"array_string_field": ["selectdb", "is", "the", "best"],
"id_field": "id-xxx-xxx",
"timestamp_field": "2022-11-12T12:08:56Z",
"array_object_field": [
{
"name": "xxx",
"age": 18
}
]
}Untuk mendefinisikan bidang ARRAY dalam struktur data di atas, Anda dapat menjalankan perintah berikut untuk menambahkan konfigurasi properti mereka di bawah properti _meta.selectdb pemetaan indeks:
# ES 7.x dan yang lebih baru
curl -X PUT "localhost:9200/doc/_mapping?pretty" -H 'Content-Type:application/json' -d '
{
"_meta": {
"selectdb":{
"array_fields":[
"array_int_field",
"array_string_field",
"array_object_field"
]
}
}
}'
# ES 6.x dan sebelumnya
curl -X PUT "localhost:9200/doc/_mapping?pretty" -H 'Content-Type: application/json' -d '
{
"_doc": {
"_meta": {
"selectdb":{
"array_fields":[
"array_int_field",
"array_string_field",
"array_object_field"
]
}
}
}
}Parameter array_fields menentukan bidang tipe ARRAY.
Praktik terbaik
Penurunan kondisi filter
Katalog Elasticsearch mendukung penurunan kondisi filter ke Elasticsearch. Hanya data yang memenuhi kondisi filter yang dikembalikan. Ini meningkatkan kinerja kueri dan mengurangi penggunaan CPU, memori, dan sumber daya I/O di kedua ApsaraDB for SelectDB dan Elasticsearch.
Operator diubah menjadi kueri Elasticsearch berikut.
Sintaks SQL | Sintaks di Elasticsearch 5.x atau yang lebih baru |
= | kueri term |
in | kueri terms |
>, <, >=, dan ⇐ | kueri range |
and | bool.filter |
or | bool.should |
not | bool.must_not |
not in | bool.must_not + kueri terms |
is_not_null | kueri exists |
is_null | bool.must_not + kueri exists |
esquery | DSL kueri JSON asli di Elasticsearch |
Aktifkan fitur pemindaian kolom untuk mempercepat kueri
Untuk mempercepat kueri, Anda dapat mengaktifkan fitur pemindaian kolom dengan mengatur parameter enable_docvalue_scan ke true.
Setelah Anda mengaktifkan fitur ini, ApsaraDB for SelectDB menerapkan dua prinsip berikut ketika Anda menanyakan data dari Elasticsearch:
Upaya terbaik: ApsaraDB for SelectDB secara otomatis memeriksa apakah penyimpanan berorientasi kolom diaktifkan untuk bidang yang akan ditanyakan. Jika parameter
doc_valuediatur ke true, penyimpanan berorientasi kolom diaktifkan untuk semua bidang. Dalam hal ini, ApsaraDB for SelectDB menanyakan semua nilai bidang dari penyimpanan berorientasi kolom.Penurunan otomatis: Jika penyimpanan berorientasi kolom dinonaktifkan untuk salah satu bidang yang akan ditanyakan, ApsaraDB for SelectDB mengurai dan menanyakan semua nilai bidang dari bidang
_sourceyang memiliki penyimpanan berorientasi baris diaktifkan.
Secara default, ApsaraDB for SelectDB pada Elasticsearch menanyakan semua kolom dari bidang _source, yang menggunakan penyimpanan berorientasi baris dan menyimpan data dalam format JSON. Dibandingkan dengan penyimpanan berorientasi kolom, pendekatan berorientasi baris kurang efisien dalam membaca beberapa catatan data sekaligus, terutama ketika hanya beberapa kolom yang perlu ditanyakan. Jika hanya beberapa kolom yang ditanyakan, kinerja menanyakan data dari bidang yang memiliki penyimpanan berorientasi kolom diaktifkan lebih dari sepuluh kali lebih besar daripada dari bidang _source.
Penyimpanan berorientasi kolom tidak dapat diaktifkan untuk bidang
TEXTdi Elasticsearch. Oleh karena itu, jika bidangTEXTmerupakan bagian dari kueri, ApsaraDB for SelectDB kembali ke menanyakan data dari bidang_source.Jika jumlah bidang yang akan ditanyakan lebih besar dari atau sama dengan 25, kinerja menanyakan data dari bidang yang memiliki penyimpanan berorientasi kolom diaktifkan pada dasarnya setara dengan kinerja dari bidang
_source.
Deteksi bidang KEYWORD
Anda dapat mengaktifkan deteksi untuk bidang tipe KEYWORD dengan mengatur parameter enable_keyword_sniff ke true.
Elasticsearch memungkinkan Anda langsung mengimpor data tanpa perlu membuat indeks. Setelah data diimpor, Elasticsearch secara otomatis membuat indeks. Untuk bidang STRING, Elasticsearch menggunakan fitur multi-bidangnya untuk membuat bidang TEXT dan KEYWORD.
Kode sampel berikut memberikan contoh cara memetakan bidang ke tipe TEXT dan KEYWORD:
"k4": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}Sebagai contoh, jika Anda melakukan kueri yang berisi kondisi filter yang ditentukan oleh operator = pada bidang k4, ApsaraDB for SelectDB pada Elasticsearch mengubah kueri menjadi kueri term di Elasticsearch. Kondisi filter SQL:
k4 = "SelectDB On ES"Kueri DSL yang dikonversi di Elasticsearch:
"term" : { "k4": "SelectDB On ES"}Karena tipe pertama dari bidang k4 adalah TEXT, nilai dari bidang k4 dipecah menjadi suku kata berikut berdasarkan tokenizer yang ditentukan untuk bidang k4: SelectDB, On, dan ES. Jika Anda tidak menentukan tokenizer untuk bidang tersebut, tokenizer standar digunakan. Kirim permintaan API berikut untuk memecah nilai di bidang K4:
POST /_analyze{ "analyzer": "standard", "text": "SelectDB On ES"}Hasil berikut dikembalikan:
{
"tokens": [
{
"token": "selectdb",
"start_offset": 0,
"end_offset": 8,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "on",
"start_offset": 9,
"end_offset": 11,
"type": "<ALPHANUM>",
"position": 1
},
{
"token": "es",
"start_offset": 12,
"end_offset": 15,
"type": "<ALPHANUM>",
"position": 2
}
]
}Lakukan kueri term berikut:
"term" : { "k4": "SelectDB On ES"}Tidak ada suku kata dalam kamus yang cocok dengan suku kata SelectDB On ES. Oleh karena itu, tidak ada hasil yang dikembalikan. Namun, jika Anda mengatur parameter enable_keyword_sniff ke true, sistem secara otomatis mengubah k4 = "SelectDB On ES" menjadi k4.keyword = "SelectDB On ES" untuk mencocokkan semantik SQL. Kueri DSL yang dikonversi di Elasticsearch:
"term" : { "k4.keyword": "SelectDB On ES"}Bidang k4.keyword bertipe KEYWORD, dan data yang ditulis ke Elasticsearch adalah suku kata lengkap. Oleh karena itu, suku kata SelectDB On ES dapat dicocokkan.
Aktifkan fitur penemuan node otomatis
Anda dapat mengaktifkan fitur penemuan node otomatis dengan mengatur parameter nodes_discovery ke true.
Setelah Anda mengaktifkan fitur ini, ApsaraDB for SelectDB menemukan semua node data yang tersedia tempat shard dialokasikan di Elasticsearch. Jika BE ApsaraDB for SelectDB tidak dapat mengakses URL node data Elasticsearch, atur parameter nodes_discovery ke false.
Alibaba Cloud Elasticsearch menggunakan instance SLB sebagai pintu masuk untuk menangani permintaan masuk. Ini mencegah akses langsung ke node kluster Elasticsearch. Oleh karena itu, Anda harus mengatur parameter nodes_discovery ke false.
Aktifkan akses HTTPS untuk kluster Elasticsearch
Anda dapat mengaktifkan akses HTTPS untuk kluster Elasticsearch dengan mengatur parameter ssl ke true.
ApsaraDB for SelectDB dikonfigurasi untuk mempercayai semua permintaan HTTPS dari FE dan BE, terlepas dari validitas sertifikat SSL.
Saran pada bidang waktu
Saran-saran ini hanya berlaku untuk tabel Elasticsearch eksternal. Bidang waktu secara otomatis dipetakan ke tipe DATE atau DATETIME di katalog Elasticsearch.
Di Elasticsearch, bidang waktu sangat fleksibel. Namun, jika tipe bidang waktu tidak ditentukan dengan benar di tabel Elasticsearch eksternal, kondisi filter tidak dapat didorong ke bawah.
Saat Anda membuat indeks, konfigurasikan bidang tanggal untuk mengakomodasi berbagai format agar memastikan kompatibilitas maksimum:
"dt": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
}Saat Anda membuat bidang di ApsaraDB for SelectDB, kami sarankan Anda mengatur parameter type ke date atau datetime. Anda juga dapat mengatur parameter type ke varchar. Anda dapat mengeksekusi pernyataan SQL berikut untuk mendorong kondisi filter ke Elasticsearch:
SELECT * FROM doe WHERE k2 > '2020-06-21';
SELECT * FROM doe WHERE k2 < '2020-06-21 12:00:00';
SELECT * FROM doe WHERE k2 < 1593497011;
SELECT * FROM doe WHERE k2 < now();
SELECT * FROM doe WHERE k2 < date_format(now(), '%Y-%m-%d');Di Elasticsearch, jika Anda tidak mengatur parameter
formatuntuk bidang waktu, format default dari bidang waktu adalahstrict_date_optional_time||epoch_millis.Jika nilai bidang DATE yang diimpor ke Elasticsearch adalah timestamp, Anda harus mengonversi timestamp ke
milliseconds. Elasticsearch memerlukan timestamp dalammillisecondsuntuk pemrosesan internal. Jika tidak, operasi yang melibatkan tabel Elasticsearch eksternal dapat menghasilkan kesalahan.
Kueri bidang metadata _id di Elasticsearch
Jika Anda mengimpor dokumen ke Elasticsearch tanpa menentukan bidang _id, Elasticsearch secara otomatis menetapkan bidang _id unik global untuk setiap dokumen. Bidang ini berfungsi sebagai kunci utama. Anda juga dapat menentukan bidang _id yang menunjukkan signifikansi bisnis tertentu untuk dokumen saat Anda mengimpor dokumen. Untuk menanyakan nilai bidang _id dari tabel Elasticsearch eksternal, Anda dapat menambahkan bidang _id bertipe VARCHAR saat Anda membuat tabel.
CREATE EXTERNAL TABLE `doe` (
`_id` varchar COMMENT "",
`city` varchar COMMENT ""
) ENGINE=ELASTICSEARCH
PROPERTIES (
"hosts" = "http://127.0.0.1:8200",
"user" = "root",
"password" = "root",
"index" = "doe"
}Untuk menanyakan nilai bidang _id dari katalog Elasticsearch, atur parameter mapping_es_id ke true.
Nilai bidang
_idhanya dapat difilter menggunakan operator=atauIN.Bidang
_idharus bertipeVARCHAR.
Lampiran
Diagram berikut menggambarkan prinsip ApsaraDB for SelectDB menanyakan data dari Elasticsearch.
+----------------------------------------------+
| |
| SelectDB +------------------+ |
| | FE +--------------+-------+
| | | Permintaan Lokasi Shard
| +--+-------------+-+ | |
| ^ ^ | |
| | | | |
| +-------------------+ +------------------+ | |
| | | | | | | | |
| | +----------+----+ | | +--+-----------+ | | |
| | | BE | | | | BE | | | |
| | +---------------+ | | +--------------+ | | |
+----------------------------------------------+ |
| | | | | | |
| | | | | | |
| HTTP SCROLL | | HTTP SCROLL | |
+-----------+---------------------+------------+ |
| | v | | v | | |
| | +------+--------+ | | +------+-------+ | | |
| | | | | | | | | | |
| | | DataNode | | | | DataNode +<-----------+
| | | | | | | | | | |
| | | +<--------------------------------+
| | +---------------+ | | |--------------| | | |
| +-------------------+ +------------------+ | |
| Node Fisik yang Sama | |
| | |
| +-----------------------+ | |
| | | | |
| | MasterNode +<-----------------+
| ES | | |
| +-----------------------+ |
+----------------------------------------------+FE mengirim permintaan ke host yang ditentukan selama pembuatan tabel untuk mendapatkan informasi tentang port HTTP semua node dan distribusi shard indeks. Jika permintaan gagal, FE secara berurutan menjelajahi daftar host hingga berhasil atau gagal sepenuhnya.
Ketika kueri dimulai, FE menghasilkan rencana eksekusi kueri berdasarkan informasi node dan metadata indeks yang diperoleh, dan mengirim rencana eksekusi ke BE yang sesuai.
BE secara bersamaan mendapatkan data bidang
_sourceatau bidang yang memiliki penyimpanan berorientasi kolom diaktifkan dari setiap shard indeks Elasticsearch dalam mode streaming menggunakan metodeHTTP Scroll.ApsaraDB for SelectDB mengembalikan hasil kepada Anda setelah menghitung hasilnya.