全部产品
Search
文档中心

ApsaraDB for SelectDB:Sumber data Elasticsearch

更新时间:Jul 30, 2025

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.

  • 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 _id di indeks Elasticsearch.

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.

Catatan
  • 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/http serta 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_value diatur 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 _source yang 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.

Penting
  • Penyimpanan berorientasi kolom tidak dapat diaktifkan untuk bidang TEXT di Elasticsearch. Oleh karena itu, jika bidang TEXT merupakan 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.

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

Catatan

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');
Penting
  • Di Elasticsearch, jika Anda tidak mengatur parameter format untuk bidang waktu, format default dari bidang waktu adalah strict_date_optional_time||epoch_millis.

  • Jika nilai bidang DATE yang diimpor ke Elasticsearch adalah timestamp, Anda harus mengonversi timestamp ke milliseconds. Elasticsearch memerlukan timestamp dalam milliseconds untuk 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.

Penting
  • Nilai bidang _id hanya dapat difilter menggunakan operator = atau IN.

  • Bidang _id harus bertipe VARCHAR.

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        |                       |          |
|           +-----------------------+          |
+----------------------------------------------+
  1. 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.

  2. Ketika kueri dimulai, FE menghasilkan rencana eksekusi kueri berdasarkan informasi node dan metadata indeks yang diperoleh, dan mengirim rencana eksekusi ke BE yang sesuai.

  3. BE secara bersamaan mendapatkan data bidang _source atau bidang yang memiliki penyimpanan berorientasi kolom diaktifkan dari setiap shard indeks Elasticsearch dalam mode streaming menggunakan metode HTTP Scroll.

  4. ApsaraDB for SelectDB mengembalikan hasil kepada Anda setelah menghitung hasilnya.