メインコンテンツまでスキップ

Elasticsearch catalog

Elasticsearch カタログ

StarRocksは、v3.1以降でElasticsearchカタログをサポートしています。

StarRocksとElasticsearchは、両方とも人気のある分析システムで、それぞれ独自の強みがあります。StarRocksは、大規模な分散コンピューティングに優れており、外部テーブルを介してElasticsearchからデータをクエリできます。Elasticsearchは、全文検索の機能で知られています。StarRocksとElasticsearchの組み合わせにより、より包括的なOLAPソリューションが提供されます。Elasticsearchカタログを使用すると、データの移行なしにStarRocksでSQL文を使用してElasticsearchクラスタ内の全てのインデックスデータを直接分析できます。

他のデータソースのカタログとは異なり、Elasticsearchカタログには作成時に「default」という名前のデータベースが1つだけ含まれています。各Elasticsearchインデックスは自動的にデータテーブルにマップされ、「default」データベースにマウントされます。

Elasticsearchカタログの作成

構文

CREATE EXTERNAL CATALOG <カタログ名>
[COMMENT <コメント>]
PROPERTIES ("キー"="値", ...)

パラメータ

カタログ名

Elasticsearchカタログの名前です。命名規則は以下の通りです。

  • 名前には文字、数字(0-9)、アンダースコア(_)を含めることができます。ただし、文字で始める必要があります。
  • 名前は大文字と小文字を区別し、長さが1023文字を超えることはできません。

コメント

Elasticsearchカタログの説明です。このパラメータはオプションです。

PROPERTIES

Elasticsearchカタログのプロパティです。以下の表に、Elasticsearchカタログでサポートされているプロパティについて説明します。

パラメータ

必須

デフォルト値

説明

hosts

Yes

なし

Elasticsearchクラスタの接続アドレスです。1つ以上のアドレスを指定できます。StarRocksは、このアドレスからElasticsearchのバージョンとインデックスのシャード割り当てを解析することができます。StarRocksは、GET /_nodes/http API操作で返されたアドレスに基づいてElasticsearchクラスタと通信します。したがって、hostsパラメータの値は、GET /_nodes/http API操作によって返されたアドレスと同じである必要があります。そうでない場合、BE(バックエンド)はElasticsearchクラスタと通信できない場合があります。

type

Yes

なし

データソースのタイプです。Elasticsearchカタログを作成する場合、このパラメータをesに設定します。

user

No

ElasticsearchクラスタにHTTPベーシック認証が有効になっている場合に使用するユーザー名です。/cluster/state/ nodes/httpなどのパスにアクセスするための権限があることを確認してください。また、インデックスを読み取るための権限があることも確認してください。

password

No

Elasticsearchクラスタにログインするために使用するパスワードです。

es.type

No

_doc

インデックスのタイプです。Elasticsearch 8以降のバージョンのデータをクエリする場合は、このパラメータを設定する必要はありません。なぜなら、Elasticsearch 8以降のバージョンではマッピングタイプが削除されているためです。

es.nodes.wan.only

No

FALSE

StarRocksがElasticsearchクラスタにアクセスしてデータをフェッチする際に、hostsで指定されたアドレスのみを使用するかどうかを指定します。

  • true:StarRocksは、hostsで指定されたアドレスのみを使用してElasticsearchクラスタにアクセスし、データをフェッチし、Elasticsearchインデックスのシャードが存在するデータノードのスニッフを行いません。Elasticsearchクラスタ内のデータノードのアドレスにアクセスできない場合は、このパラメータをtrueに設定する必要があります。
  • false:StarRocksは、hostsで指定されたアドレスを使用して、Elasticsearchクラスタ内のデータノードのアドレスをスニッフし、インデックスのシャードからデータをフェッチします。StarRocksがElasticsearchクラスタ内のデータノードのアドレスにアクセスできる場合は、デフォルト値であるfalseを保持することをお勧めします。

es.net .ssl

No

FALSE

ElasticsearchクラスタにアクセスするためにHTTPSプロトコルを使用できるかどうかを指定します。このパラメータの設定は、StarRocks v2.4以降でのみサポートされています。

  • true:HTTPSおよびHTTPの両方のプロトコルを使用してElasticsearchクラスタにアクセスできます。
  • false:HTTPのみを使用してElasticsearchクラスタにアクセスできます。

enable_docvalue_scan

No

TRUE

Elasticsearchの列ストレージから対象フィールドの値を取得するかどうかを指定します。ほとんどの場合、列ストレージからデータを読み取る方が行ストレージからデータを読み取るよりも性能が向上します。

enable_keyword_sniff

No

TRUE

KEYWORDタイプのフィールドに基づいて、ElasticsearchのTEXTタイプのフィールドをスニッフするかどうかを指定します。このパラメータをfalseに設定すると、StarRocksはトークン化後にマッチングを実行します。

以下の例は、es_testという名前のElasticsearchカタログを作成しています。

CREATE EXTERNAL CATALOG es_test
COMMENT 'test123'
PROPERTIES
(
"type" = "es",
"es.type" = "_doc",
"hosts" = "https://xxx:9200",
"es.net.ssl" = "true",
"user" = "admin",
"password" = "xxx",
"es.nodes.wan.only" = "true"
);

プレディケートのプッシュダウン

StarRocksでは、クエリで指定されたプレディケートをElasticsearchテーブルに対してElasticsearchで実行するためにプッシュダウンすることができます。これにより、クエリエンジンとストレージソースの間の距離が縮まり、クエリのパフォーマンスが向上します。次の表に、Elasticsearchにプッシュダウンできる演算子を示します。

SQLの構文

Elasticsearchの構文

=

termクエリ

in

termsクエリ

>=, <=, >, <

range

and

bool.filter

or

bool.should

not

bool.must_not

not in

bool.must_not + terms

esquery

ES Query DSL

クエリ例

esquery()関数を使用すると、SQLでは表現できないmatchクエリやgeoshapeクエリなどのElasticsearchクエリをElasticsearchにプッシュダウンしてフィルタリングや処理を行うことができます。esquery()関数では、最初のパラメータはカラム名を指定し、2番目のパラメータはカーリーブラケット({})で囲まれたElasticsearchクエリのElasticsearch Query DSLのJSON表現です。JSON表現は1つのルートキー(「match」、「geo_shape」、「bool」など)のみを持つことができ、持つ必要があります。

  • matchクエリ

    SELECT * FROM es_table WHERE esquery(k4, '{
    "match": {
    "k4": "StarRocks on elasticsearch"
    }
    }');
  • geoshapeクエリ

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

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

使用上の注意

  • v5.x以降、Elasticsearchは異なるデータスキャン方法を採用しています。StarRocksは、Elasticsearch v5.x以降からのデータのクエリのみをサポートしています。
  • StarRocksは、HTTPベーシック認証が有効になっているElasticsearchクラスタからのデータのクエリのみをサポートしています。
  • count()を含むクエリなど、一部のクエリはElasticsearchよりもStarRocksで遅く実行される場合があります。なぜなら、Elasticsearchはリクエストされたデータをフィルタリングする必要がなく、クエリ条件を満たすドキュメントの指定された数に関連するメタデータを直接読み取ることができるからです。