Tüm Ürünler
Search
Belge Merkezi

ApsaraDB for SelectDB:Elasticsearch veri kaynağı

Son Güncelleme:Oct 07, 2026

ApsaraDB for SelectDB, bir Elasticsearch kataloğu aracılığıyla Elasticsearch verilerini doğrudan sorgulamayı destekler; bu sayede verileri taşımanıza gerek kalmadan birleşik OLAP analizi yapabilirsiniz. Katalog, Elasticsearch dizin meta verilerini otomatik olarak eşler ve hem Elasticsearch içindeki çoklu dizin birleştirmelerini hem de SelectDB ile Elasticsearch arasındaki sistemler arası birleştirmeleri destekler.

Desteklenen sürümler: Elasticsearch 5.X ve üzeri.

Ön koşullar

Başlamadan önce aşağıdakileri yaptığınızdan emin olun:

Elasticsearch kataloğu oluşturma

CREATE CATALOG test_es PROPERTIES (
    "type"="es",
    "hosts"="http://127.0.0.1:9200",
    "user"="test_user",
    "password"="test_passwd",
    "nodes_discovery"="false"
);

Elasticsearch'te veritabanı kavramı bulunmadığından, SelectDB katalog altında otomatik olarak default_db adlı tek bir veritabanı oluşturur. SWITCH komutuyla kataloğa geçtikten sonra SelectDB otomatik olarak default_db veritabanına girer; USE default_db ifadesini kullanmanıza gerek yoktur.

Parametreler

Parametre Zorunlu Varsayılan Açıklama
hosts Evet — Elasticsearch veri kaynağının URL'si. Bir veya daha fazla URL ya da kümenin önünde bulunan bir Server Load Balancer (SLB) örneğinin URL'si kabul edilir.
user Hayır — Elasticsearch veri kaynağına erişmek için kullanılan hesap.
password Hayır — Hesabın parolası.
doc_value_scan Hayır true Alan değerlerini sorgulamak için sütun tabanlı depolamayı (doc_values) etkinleştirin.
keyword_sniff Hayır true TEXT alanlarını algılayıp bunlara karşılık gelen KEYWORD alt alanları üzerinden sorgulama yapar. false olarak ayarlanırsa, sorgular TEXT alanından alınan belirteçlerle eşleşir.
nodes_discovery Hayır true Otomatik düğüm keşfini etkinleştirir. Alibaba Cloud Elasticsearch kullanırken, trafik bir SLB örneği üzerinden yönlendirildiği ve düğümler doğrudan açığa çıkarılmadığı için false olarak ayarlayın.
ssl Hayır false HTTPS erişimini etkinleştirir. SelectDB, SSL sertifikasının geçerliliğinden bağımsız olarak frontend (FE) ve backend (BE) düğümlerinden gelen tüm HTTPS isteklerine güvenir.
mapping_es_id Hayır false Elasticsearch dizininden gelen _id meta veri alanını eşler.
like_push_down Hayır true LIKE koşullarını Elasticsearch joker karakterlerine dönüştürerek bunları Elasticsearch'e aktarır. Bu işlem, Elasticsearch tarafındaki CPU kullanımını artırır.
include_hidden_index Hayır false Gizli dizinleri dahil eder.
Yalnızca HTTP temel kimlik doğrulaması desteklenir. Hesabın /_cluster/state/ ve _nodes/http uç noktalarına okuma erişiminin yanı sıra dizinlerde okuma izninin olması gerekir. HTTPS etkinleştirilmemişse hesap ve parola isteğe bağlıdır. Birden fazla tür içeren Elasticsearch 5.x veya 6.x dizinleri için SelectDB yalnızca ilk türden veri okur.

Veri sorgulama

Katalogu oluşturduktan sonra, Elasticsearch tablolarını dahili SelectDB tablolarını sorguladığınız şekilde sorgulayabilirsiniz. Aşağıdaki üç yaklaşım da eşdeğerdir:

-- Switch to the catalog, then query
SWITCH test_es;
SELECT * FROM es_table LIMIT 10;

-- Use the fully qualified database path
USE test_es.default_db;
SELECT * FROM es_table LIMIT 10;

-- Use the fully qualified table name directly
SELECT * FROM test_es.default_db.es_table LIMIT 10;
Harici Elasticsearch tabloları için Rollup, ön toplama ve materyalleştirilmiş görünümler kullanılamaz.

Temel sorgular

SELECT * FROM es_table WHERE k1 > 1000 AND k3 = 'term' OR k4 LIKE 'fu*z_';

Gelişmiş esquery

SQL ile ifade edilemeyen sorguları — örneğin match_phrase ve geo_shape — doğrudan Elasticsearch'e aktarmak için esquery(field, QueryDSL) işlevini kullanın. field parametresi sorguyu bir dizinle ilişkilendirir. QueryDSL parametresi, tam olarak bir kök anahtarı olan bir JSON nesnesidir.

match_phrase sorgusu:

SELECT * FROM es_table WHERE esquery(k4, '{"match_phrase": {"k4": "selectdb on es"}}');

geo_shape sorgusu:

SELECT * FROM es_table WHERE esquery(k4, '{"geo_shape": {"location": {"shape": {"type": "envelope", "coordinates": [[13, 53], [14, 52]]}, "relation": "within"}}}');

bool sorgusu:

SELECT * FROM es_table WHERE esquery(k4, '{"bool": {"must": [{"terms": {"k1": [11, 12]}}, {"terms": {"k2": [100]}}]}}');

Sütun türü eşlemeleri

Elasticsearch türü SelectDB türü Notlar
NULL NULL
BOOLEAN BOOLEAN
BYTE TINYINT
SHORT SMALLINT
INTEGER INT
LONG BIGINT
UNSIGNED_LONG LARGEINT
FLOAT FLOAT
HALF_FLOAT FLOAT
DOUBLE DOUBLE
SCALED_FLOAT DOUBLE
DATE DATE Desteklenen biçimler: varsayılan, yyyy-MM-dd HH:mm:ss, yyyy-MM-dd, epoch_millis
KEYWORD STRING
TEXT STRING
IP STRING
NESTED STRING
OBJECT STRING
OTHER DESTEKLENMİYOR

ARRAY türü

Elasticsearch'te açık bir ARRAY türü bulunmaz ancak bir alan sıfır veya daha fazla değer içerebilir. SelectDB'de bir alanı dizi olarak bildirmek için dizin eşlemesinde _meta.selectdb altına bir array_fields girişi ekleyin.

doc dizini için örnek veri yapısı:

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

Dizi alanlarını bildirmek için eşlemeyi güncelleyin:

# Elasticsearch 7.x and later
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"
            ]
        }
    }
}'

# Elasticsearch 6.x and earlier
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"
                ]
            }
        }
    }
}'

En iyi uygulamalar

Filtre koşulu aktarma

SelectDB, filtre koşullarını Elasticsearch'e aktararak yalnızca eşleşen verilerin döndürülmesini sağlar; bu sayede her iki sistemde de CPU, bellek ve G/Ç yükü azalır. Aşağıdaki tabloda SQL operatörlerinin Elasticsearch Query DSL ile nasıl eşleştiği gösterilmektedir.

SQL sözdizimi Elasticsearch sorgusu
= term sorgusu
IN terms sorgusu
>, <, >=, <= range sorgusu
AND bool.filter
OR bool.should
NOT bool.must_not
NOT IN bool.must_not + terms sorgusu
IS NOT NULL exists sorgusu
IS NULL bool.must_not + exists sorgusu
esquery Yerel Query DSL

Sorguları hızlandırmak için sütun taramasını etkinleştirme

Alan değerlerini _source alanı yerine sütun tabanlı depolamadan (doc_values) okumak için enable_docvalue_scan parametresini true olarak ayarlayın. Yalnızca birkaç sütun sorgulandığında, sütun taraması _source üzerinden okumaya göre on kat daha hızlı olabilir.

Sütun taraması etkinleştirildiğinde SelectDB iki ilke uygular:

  • En iyi çaba: Sorgulanan tüm alanlarda doc_value etkinse SelectDB tamamen sütun tabanlı depolamadan okuma yapar.

  • Otomatik geri dönüş: Sorgulanan alanlardan herhangi biri doc_value içermiyorsa SelectDB tüm alanlar için _source üzerinden okumaya geri döner.

Önemli
  • TEXT alanları sütun tabanlı depolamayı kullanamaz. Sorguda bir TEXT alanı varsa SelectDB _source üzerinden okuma yapar.

  • 25 veya daha fazla alan sorgulandığında, sütun taraması ile _source arasındaki performans farkı ihmal edilebilir düzeydedir.

KEYWORD alanlarını algılama

STRING alanlarındaki eşitlik sorguları için SelectDB'nin otomatik olarak KEYWORD alt alanlarını kullanmasını sağlamak amacıyla enable_keyword_sniff parametresini true olarak ayarlayın.

Elasticsearch bir dizini otomatik olarak oluşturduğunda STRING alanları hem bir TEXT alanı hem de bir KEYWORD alt alanı alır:

"k4": {
    "type": "text",
    "fields": {
        "keyword": {
            "type": "keyword",
            "ignore_above": 256
        }
    }
}

Keyword sniffing olmadan, k4 = "SelectDB On ES" SQL koşulu şu Query DSL'i oluşturur:

"term": {"k4": "SelectDB On ES"}

k4 bir TEXT alanı olduğundan değeri selectdb, on ve es belirteçlerine ayrıştırılır; bunların hiçbiri tam ifadeyle eşleşmediği için sonuç dönmez.

enable_keyword_sniff parametresi true olarak ayarlandığında SelectDB koşulu otomatik olarak KEYWORD alt alanını hedefleyecek şekilde yeniden yazar:

"term": {"k4.keyword": "SelectDB On ES"}

KEYWORD alanı orijinal değiştirilmemiş değeri sakladığından tam ifade doğru şekilde eşleşir.

Düğüm keşfini etkinleştirme

SelectDB'nin parçaları atanmış tüm Elasticsearch veri düğümlerini keşfetmesine olanak tanımak için nodes_discovery parametresini true olarak ayarlayın.

Alibaba Cloud Elasticsearch trafiği bir SLB örneği üzerinden yönlendirir; bu durum, küme düğümlerine doğrudan erişimi engeller. Alibaba Cloud Elasticsearch'e bağlanırken nodes_discovery parametresini her zaman false olarak ayarlayın.

HTTPS'yi etkinleştirme

Elasticsearch kümesine HTTPS üzerinden bağlanmak için ssl parametresini true olarak ayarlayın. SelectDB, SSL sertifikasının geçerliliğinden bağımsız olarak FE ve BE düğümlerinden gelen tüm HTTPS isteklerine güvenir.

Zaman alanlarını işleme

Bu bölümdeki yönergeler yalnızca harici Elasticsearch tabloları için geçerlidir. Elasticsearch katalogları için zaman alanları otomatik olarak DATE veya DATETIME türüne eşlenir.

Geniş bir giriş aralığını desteklemek için Elasticsearch'teki tarih alanı biçimini yapılandırın:

"dt": {
    "type": "date",
    "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
}

SelectDB'de alanı date, datetime veya varchar olarak tanımlayın. Aşağıdaki filtre koşullarının tümü doğru şekilde aktarılır:

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');
Önemli
  • Elasticsearch'te format ayarlanmamışsa varsayılan değer strict_date_optional_time||epoch_millis olur.

  • Elasticsearch'te bir DATE alanına zaman damgası değerleri aktarırken zaman damgası milisaniye cinsinden olmalıdır. Elasticsearch, dahili işleme için milisaniye hassasiyeti gerektirir; diğer birimler hata oluşmasına neden olur.

_id alanını sorgulama

Elasticsearch, içe aktarma sırasında belirtilmemişse her belgeye otomatik olarak genel olarak benzersiz bir _id atar. Harici bir tablodan _id değerini sorgulamak için bunu bir VARCHAR sütunu olarak bildirin:

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"
);

Bir Elasticsearch kataloğundan _id değerini sorgulamak için mapping_es_id parametresini true olarak ayarlayın.

Önemli
  • _id alanını yalnızca = veya IN operatörü kullanarak filtreleyin.

  • _id alanının türü VARCHAR olmalıdır.

Sınırlamalar

  • Rollup, ön toplama, materyalleştirilmiş görünümler: Harici Elasticsearch tabloları için desteklenmez.

Nasıl çalışır

+----------------------------------------------+
|                                              |
| SelectDB   +------------------+              |
|            |       FE         +--------------+-------+
|            |                  |  Request Shard Location
|            +--+-------------+-+              |       |
|               ^             ^                |       |
|               |             |                |       |
|  +-------------------+ +------------------+  |       |
|  |            |      | |    |             |  |       |
|  | +----------+----+ | | +--+-----------+ |  |       |
|  | |      BE       | | | |      BE      | |  |       |
|  | +---------------+ | | +--------------+ |  |       |
+----------------------------------------------+       |
   |        |          | |        |         |          |
   |        |          | |        |         |          |
   |    HTTP SCROLL    | |    HTTP SCROLL   |          |
+-----------+---------------------+------------+       |
|  |        v          | |        v         |  |       |
|  | +------+--------+ | | +------+-------+ |  |       |
|  | |               | | | |              | |  |       |
|  | |   DataNode    | | | |   DataNode   +<-----------+
|  | |               | | | |              | |  |       |
|  | |               +<--------------------------------+
|  | +---------------+ | | |--------------| |  |       |
|  +-------------------+ +------------------+  |       |
|   Same Physical Node                         |       |
|                                              |       |
|           +-----------------------+          |       |
|           |                       |          |       |
|           |      MasterNode       +<-----------------+
| ES        |                       |          |
|           +-----------------------+          |
+----------------------------------------------+

Sorgu akışı aşağıdaki gibi çalışır:

  1. FE, yapılandırılmış ana bilgisayara tüm düğümler için HTTP bağlantı noktası bilgilerini ve dizinin parça dağılımını almak üzere bir istek gönderir. İstek başarısız olursa FE, başarılı olana kadar ana bilgisayar listesini sırayla tarar.

  2. FE, düğüm ve dizin meta verilerine dayalı olarak bir sorgu yürütme planı oluşturur ve bunu ilgili BE'lere gönderir.

  3. Her BE, HTTP Scroll API kullanarak akış modunda atanan Elasticsearch dizin parçalarından eşzamanlı olarak veri çeker; sorguya bağlı olarak _source (satır tabanlı) veya doc_values (sütun tabanlı) üzerinden okuma yapar.

  4. SelectDB nihai sonuçları hesaplar ve döndürür.